前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go 基于tcp的RPC远程调用

go 基于tcp的RPC远程调用

作者头像
贵哥的编程之路
发布2024-03-25 08:07:47
720
发布2024-03-25 08:07:47
举报

在运行go文件的地方:新建server(服务端)与client(客户端)目录,在里面都写上main.go文件

server(服务端)main.go

代码语言:javascript
复制
package main

import (
	"fmt"
	"net"
	"net/rpc"
	"net/rpc/jsonrpc"
)
/*创建一个 FoodService 结构体,其中包含了一个 SayName 方法,用于处理客户端发送过来的请求,并返回相应的响应。*/
type FoodService struct {
}

func (f *FoodService) SayName(request string, resp *string) error {
	*resp = "您点的菜是" + request
	return nil

}

func main() {
	//在 main 函数中,通过 net.Listen 方法监听本地 9090 端口的 TCP 连接。
	listen, err := net.Listen("tcp", "localhost:9090")
	if err != nil {
		fmt.Println(err)
		return
	}
	//使用 rpc.RegisterName 注册了一个名为 "FoodService" 的 RPC 服务,并将其与 FoodService 结构体关联起来。
	err = rpc.RegisterName("FoodService", &FoodService{})
	if err != nil {
		fmt.Println(err)
		return
	}
	/*进入一个无限循环,不断等待客户端的连接请求,一旦有客户端连接进来,就会创建一个新的协程(goroutine)来处理该连接。*/
	for {
		// 等待请求,然后接受处理 , wait request and conncetion, 返回下一个 请求者。
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println(err)
			return
		}

	
		go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
//jsonrpc.NewServerCodec 和 rpc.ServeCodec 的组合使得服务端能够处理 JSON-RPC 格式的请求和响应,实现了基于 JSON 格式的远程过程调用(RPC)功能。这样,客户端和服务端之间就可以通过 JSON 格式进行数据交换,实现远程方法调用。	}

}
}

client:main.go(客户端)

代码语言:javascript
复制
package main

import (
	"fmt"
	"net"
	"net/rpc"
	"net/rpc/jsonrpc"
)

func main() {
	/*在 main 函数中,通过 net.Dial 方法连接到本地 9090 端口的 TCP 服务端。*/
	c, err := net.Dial("tcp", "localhost:9090")
	if err != nil {
		fmt.Println(err)
		return
	}

	reply := ""
//创建一个使用 JSON-RPC 编解码器的客户端。
	client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(c))
	//client.Call 方法的作用是向远程服务端发送一个请求,并等待服务端处理完请求后返回结果。其基本语法通常为:
	err = client.Call("FoodService.SayName", "cy666g", &reply)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(reply)

}

首先运行服务端的main.go文件

然后不要关闭服务端的main.go运行文件。然后运行客户端的main.go文件

什么事RPC?

服务端指的是接收客户端请求并提供相应服务的程序。当客户端发起远程调用请求时,服务端程序会接收这个请求,并执行相应的远程过程或方法,然后将结果返回给客户端。

具体来说,在RPC中:

服务端负责实现远程方法或过程,并对外提供这些方法的调用接口。 客户端发起调用请求,服务端接收请求并执行相应的方法,最终将结果返回给客户端。

rpc流程:监听并接受客户端的连接请求。 解析客户端发送的请求,确定需要执行的远程方法。 执行相应的远程方法或过程。 将执行结果返回给客户端。

Stub(存根):客户端和服务端之间的代理,用于封装和传输数据。

在 Go 中,存根通常是通过创建一个实现了特定接口的结构体来实现的。这个结构体将接口的方法进行实现

传输协议:定义客户端和服务端之间通信的规则和方式。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么事RPC?
  • Stub(存根):客户端和服务端之间的代理,用于封装和传输数据。
  • 传输协议:定义客户端和服务端之间通信的规则和方式。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档