主机不能访问虚拟机上的rpc服务

问题

当我在虚拟机(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
收到的数据为: 你好~周小小

如果这篇文章帮助到你的话,点个赞再走吧~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容