问题
当我在虚拟机(centos7)上注册并启动了一个rpc服务如下:
package main
import (
"net"
"net/rpc"
)
//定义类对象
type Hi struct {}
func (h *Hi) Hello (req string,reply *string) error{ //此函数只能有两个可序列化的参数
*reply = "你好~" + req
return nil
}
func (sport *Hi) Football (req string,reply *string) error{ //此函数只能有两个可序列化的参数
*reply = "你想一起踢足球吗?" + req
return nil
}
//
func main(){
//rpc注册服务
//注册rpc服务,维护一个hash表,key是服务名称,value值是服务的地址
rpc.RegisterName("Hi",new(Hi))
//设置服务监听
listener,err := net.Listen("tcp","192.168.124.11:1111")
if err != nil{
panic(err)
}
defer listener.Close()
for {
//接受传输的数据,conn是连接建立的套接字
conn, err := listener.Accept()
if err != nil {
panic(err)
}
go rpc.ServeConn(conn) //ServeConn阻塞,为连接提供服务,直到客户端挂断为止
}
}
然后在主机上启动了一个客户端程序如下:
package main
import (
"fmt"
"net/rpc"
)
func main(){
//用rpc连接
client,err := rpc.Dial("tcp","192.168.137.25:1111")
if err != nil{
panic(err)
}
defer client.Close()
var reply string
//调用服务中的函数
err = client.Call("Hi.Hello","周小小",&reply)
if err != nil{
panic(err)
}
//err = client.Call("Hi.Football","周小小",&reply)
//if err != nil{
// panic(err)
//}
fmt.Println("收到的数据为:",reply)
}
主机和虚拟机可以相互ping通,但是却收不到任何回复:
$ go run client.go
panic: dial tcp 192.168.137.25:1111: connectex: A connection attempt failed because the connected party did not properly re
spond after a period of time, or established connection failed because connected host has failed to respond.
goroutine 1 [running]:
main.main()
F:/workspace/src/learn/RPC/demo/client.go:14 +0x25c
exit status 2
原因:
虚拟机端口1111未开放。可通过如下指令查看:
firewall-cmd --query-port=1111/tcp
返回no就是未开放。
解决方法:
1.通过如下指令开启1111端口:
firewall-cmd --zone=public --add-port=1111/tcp --permanent
2.重启防火墙使端口生效:
firewall-cmd --reload
(执行完这一步可重新查看一下1111端口是否已经开放)
3.重新调用虚拟机上的rpc服务 ,发现已经可以正常得到响应:
$ go run client.go
收到的数据为: 你好~周小小
网友评论