主機不能訪問虛擬機上的rpc服務

問題

當我在虛擬機(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ù)為: 你好~周小小

如果這篇文章幫助到你的話,點個贊再走吧~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容