一个通过rpc实现客户端和服务端连接的小例子
服务端
package main
import (
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
type HelloService struct {
}
func (s *HelloService) Hello(request string, reply *string) error {
//返回值是通过修改reply的值
*reply = "hello, " + request
return nil
}
func main() {
//1.实例化一个server
listener, _ := net.Listen("tcp", ":1234")
//2.注册处理逻辑
_ = rpc.RegisterName("HelloService", &HelloService{})
//3.启动服务
conn, _ := listener.Accept() //当一个新的连接进来的时候
rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
}
客户端
package main
import (
"encoding/json"
"fmt"
"net"
"net/rpc"
"net/rpc/jsonrpc"
"time"
"github.com/kirinlabs/HttpRequest"
)
func main() {
//1.建立连接
conn, err := net.Dial("tcp", "127.0.0.1:1234")
if err != nil {
fmt.Println(err)
}
var reply *string = new(string)
client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))
err = client.Call("HelloService.Hello", "bobby", reply)
if err != nil {
panic("调用失败")
}
fmt.Println(*reply)
}
错误内容
dial tcp: lookup localhost: no such host
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0xdbdab5b]
主要问题是不能将localhost解析为127.0.0.1,将localhost改为127.0.0.1就可以了。