我正在使用 msgpack 的 golang 构建一个 RPC 服务器。客户端是使用 mprpc 库(使用 gevent 通过 TCP 的 msgpack)在 python 中构建的。
我的问题是,作为网络领域的绝对菜鸟,我发现我不能在同一台计算机上同时运行多个客户端使用相同的地址/端口(我猜套接字已经绑定,它只是停顿和超时)。
我环顾四周,但我不确定我应该做什么才能让同一台机器上的多个客户端与服务器通信(来回 msgpack)。这是我需要使用 ZeroMQ 的情况吗?还是通过 HTTP 请求?
谢谢 !
TCP 是一种面向连接的协议。这意味着只有服务器需要有一个固定的、已知的端口。客户端可以使用它想要的任何端口,因为没有人与客户端建立连接。
那么,服务器如何知道如何与客户端通信呢?每当它接受一个连接时,它就会被告知该连接来自谁。但通常情况下,您甚至不需要它,因为套接字会跟踪连接来自谁。只需接收并发送该套接字,您就可以与正确的客户端交谈。
您可能应该阅读Python 文档中的Socket Programming HOWTO或其他一些教程,但简要地...
服务器是这样启动的:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', 12345))
sock.listen(5)
while True:
csock, addr = sock.accept()
它bind
是端口和listen
s 并围绕accept
ing 连接并用它们做一些事情。
另一方面,客户端只是这样做:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 12345))
……或者,等效地:
sock = socket.create_connection(('localhost', 12345))
它不调用bind
,它只是创建一个连接,让套接字库在该连接的适当接口上选择一个任意端口。除非您已经打开了数千个套接字,否则它应该始终能够为您找到一个空闲端口。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句