在 GO 中使用 UDP 的 RPC

Unity3D 网络库使用 UDP 并具有用于 RPC 调用的方法。我试图让我的服务器通过 UDP 使用 RPC,但我遇到了一些麻烦。这是我现在得到的基本服务器代码:


type Args struct {

  X, Y int

}


type RequestHandler struct{}


func (self *RequestHandler) Add(args *Args, reply *int) error {

  *reply = args.X + args.Y

  return nil

}


func main() {

  addr := net.UDPAddr{ Port: 5127, IP: net.ParseIP("127.0.0.1") } 

  handler := new(RequestHandler)


  rpc.Register(handler)

  conn, err := net.ListenUDP("udp", &addr)

  defer conn.Close()


  if err != nil {

    panic(err)

  }


  for {

    go rpc.ServeConn(conn)

  }

}

这是客户端代码:


type Args struct {

  X, Y int

}


func main() {

  client, err := rpc.Dial("udp", "127.0.0.1:5127")

  if err != nil { log.Fatal("dialing:", err) }


  // Synchronous call

  args := &Args{7,8}

  var reply int

  err = client.Call("RequestHandler.Add", args, &reply)

  if err != nil {

    log.Fatal("arith error:", err)

  }


  fmt.Printf("Result: %d + %d = %d", args.X, args.Y, reply)

}

当我运行这些时,它们都挂了,什么也没发生。我究竟做错了什么?


慕的地6264312
浏览 372回答 1
1回答

Smart猫小萌

由于 UDP 套接字的性质,基于 UDP 的 RPC 需要特殊的 UDP 感知处理。没有连接,只是发送到一个地址的数据报。为了让客户端得到回复,它必须设置一个监听套接字,然后将它与请求一起发送到服务器。然后服务器将回复客户端地址。net/rpc 对非面向连接的传输(即:UDP)没有任何特殊情况处理我不知道有任何实现无连接 RPC for go 的包,因此您可能必须在这里推出自己的包。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go