美文网首页
主机不能访问虚拟机上的rpc服务

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

作者: 牧神_c9dd | 来源:发表于2021-06-15 12:14 被阅读0次

问题

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

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

相关文章

网友评论

      本文标题:主机不能访问虚拟机上的rpc服务

      本文链接:https://www.haomeiwen.com/subject/shlzeltx.html