RPC over TCP 与同一台机器上的多个客户端
RPC over TCP with multiple clients on same machine
我正在 golang 中构建一个使用 msgpack 的 RPC 服务器。
客户端是使用 mprpc 库在 python 中构建的(msgpack over TCP with gevent)。
我的问题是,作为一个绝对的网络菜鸟,我发现我不能在同一台计算机上同时对多个客户端 运行 使用同一个 address/port(套接字已经绑定我猜猜,它只是停顿和超时)。
我环顾四周但我不确定我应该做什么才能让同一台机器上的多个客户端与服务器通信(来回 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
并且围绕 accept
连接并用它们做一些事情。
另一方面,客户只是这样做:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 12345))
… 或者,等价地:
sock = socket.create_connection(('localhost', 12345))
它不调用 bind
,它只是创建一个连接,让套接字库在适当的接口上为该连接选择一个任意端口。除非您已经打开了数千个套接字,否则它应该始终能够为您找到空闲端口。
如果你想有双向连接,那么 HTTP 不适合这个。因为 HTTP 的设计方式是服务器只响应请求,这会阻止服务器自己发出请求。还有其他解决方案提供双向连接(服务器到客户端和客户端到服务器同时)。
WebSocket
是我第一个想到的。当然ZeroMQ
也可以这样做。
我正在 golang 中构建一个使用 msgpack 的 RPC 服务器。 客户端是使用 mprpc 库在 python 中构建的(msgpack over TCP with gevent)。
我的问题是,作为一个绝对的网络菜鸟,我发现我不能在同一台计算机上同时对多个客户端 运行 使用同一个 address/port(套接字已经绑定我猜猜,它只是停顿和超时)。
我环顾四周但我不确定我应该做什么才能让同一台机器上的多个客户端与服务器通信(来回 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
并且围绕 accept
连接并用它们做一些事情。
另一方面,客户只是这样做:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 12345))
… 或者,等价地:
sock = socket.create_connection(('localhost', 12345))
它不调用 bind
,它只是创建一个连接,让套接字库在适当的接口上为该连接选择一个任意端口。除非您已经打开了数千个套接字,否则它应该始终能够为您找到空闲端口。
如果你想有双向连接,那么 HTTP 不适合这个。因为 HTTP 的设计方式是服务器只响应请求,这会阻止服务器自己发出请求。还有其他解决方案提供双向连接(服务器到客户端和客户端到服务器同时)。
WebSocket
是我第一个想到的。当然ZeroMQ
也可以这样做。