在运行go文件的地方:新建server(服务端)与client(客户端)目录,在里面都写上main.go文件
server(服务端)main.go
package main
import (
"fmt"
"net"
"net/rpc"
)
//定义了一个结构体 FoodService
/*FoodService 结构体用于定义一个远程服务,其中包含了一个名为 SayName 的远程方法。
客户端可以通过调用这个方法来请求服务端对特定任务进行处理,
比如在输入的请求字符串前面添加固定的前缀字符串。*/
type FoodService struct{
}
//SayName 方法是我们在服务端定义的远程函数,它接收一个字符串参数 request,并返回一个字符串指针 resp 和一个错误(error)。
func (f *FoodService) SayName(request string,resp *string) error{
*resp="cyg"+request
return nil
}
func main(){
listener,err:=net.Listen("tcp",":9090")
if err!=nil{
fmt.Println(err)
return
}
//注册了FoodService结构体代表了与RPC关联起来
err=rpc.RegisterName("FoodService",&FoodService{})
if err != nil {
fmt.Println(err)
return
}
/*然后程序会阻塞在 listener.Accept() 上,
等待客户端的连接请求。一旦有客户端连接进来,就会调用 rpc.ServeConn 来处理该连接上的所有 RPC 请求。*/
conn,err:=listener.Accept()
if err != nil {
fmt.Println(err)
return
}
rpc.ServeConn(conn)
}
client:main.go(客户端)
package main
import (
"fmt"
"net/rpc"
)
func main(){
//首先通过 rpc.Dial 连接到指定的 RPC 服务端
c,err:=rpc.Dial("tcp","localhost:9090")
if err != nil {
fmt.Println(err)
return
}
reply:=""
//然后调用 c.Call 来远程调用 FoodService 中的 SayName 方法,并传入参数 "cxyg"。
err=c.Call("FoodService.SayName","cxyg",&reply)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(reply)//最后打印出从远程服务器返回的结果。
}
首先运行服务端的main.go文件
然后不要关闭服务端的main.go运行文件。然后运行客户端的main.go文件
服务端指的是接收客户端请求并提供相应服务的程序。当客户端发起远程调用请求时,服务端程序会接收这个请求,并执行相应的远程过程或方法,然后将结果返回给客户端。
具体来说,在RPC中:
服务端负责实现远程方法或过程,并对外提供这些方法的调用接口。 客户端发起调用请求,服务端接收请求并执行相应的方法,最终将结果返回给客户端。
rpc流程:监听并接受客户端的连接请求。 解析客户端发送的请求,确定需要执行的远程方法。 执行相应的远程方法或过程。 将执行结果返回给客户端。
在 Go 中,存根通常是通过创建一个实现了特定接口的结构体来实现的。这个结构体将接口的方法进行实现