在运行go文件的地方:新建server(服务端)与client(客户端)目录,在里面都写上main.go文件
server(服务端)main.go
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(客户端)
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流程:监听并接受客户端的连接请求。 解析客户端发送的请求,确定需要执行的远程方法。 执行相应的远程方法或过程。 将执行结果返回给客户端。
在 Go 中,存根通常是通过创建一个实现了特定接口的结构体来实现的。这个结构体将接口的方法进行实现