問題
當我在虛擬機(centos7)上注冊并啟動了一個rpc服務如下:
package main
import (
"net"
"net/rpc"
)
//定義類對象
type Hi struct {}
func (h *Hi) Hello (req string,reply *string) error{ //此函數(shù)只能有兩個可序列化的參數(shù)
*reply = "你好~" + req
return nil
}
func (sport *Hi) Football (req string,reply *string) error{ //此函數(shù)只能有兩個可序列化的參數(shù)
*reply = "你想一起踢足球嗎?" + req
return nil
}
//
func main(){
//rpc注冊服務
//注冊rpc服務,維護一個hash表,key是服務名稱,value值是服務的地址
rpc.RegisterName("Hi",new(Hi))
//設置服務監(jiān)聽
listener,err := net.Listen("tcp","192.168.124.11:1111")
if err != nil{
panic(err)
}
defer listener.Close()
for {
//接受傳輸?shù)臄?shù)據(jù),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
//調用服務中的函數(shù)
err = client.Call("Hi.Hello","周小小",&reply)
if err != nil{
panic(err)
}
//err = client.Call("Hi.Football","周小小",&reply)
//if err != nil{
// panic(err)
//}
fmt.Println("收到的數(shù)據(jù)為:",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
(執(zhí)行完這一步可重新查看一下1111端口是否已經(jīng)開放)
3.重新調用虛擬機上的rpc服務 ,發(fā)現(xiàn)已經(jīng)可以正常得到響應:
$ go run client.go
收到的數(shù)據(jù)為: 你好~周小小