我正在使用msgpack的golang中构建一个RPC服务器。 使用mprpc库(使用gevent的TCP上的msgpack)在python中构建客户端。
我的问题是,作为网络中的绝对菜鸟,我发现我无法在同一台计算机上一次运行多个客户端的情况下使用相同的地址/端口(套接字已经绑定,我认为它只是停滞和超时)
我已经四处查看了,但是我不确定要使同一台计算机上的多个客户端能够与服务器通信(来回msgpack),我该怎么做。这是我需要使用ZeroMQ的情况吗?还是通过HTTP请求?
谢谢!
答案 0 :(得分:0)
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
,它只是创建一个连接,让套接字库在适当的接口上为该连接选择一个任意端口。除非您已经打开了数千个套接字,否则它应该总是能够为您找到一个空闲端口。
答案 1 :(得分:0)
如果要建立双向连接,则HTTP不适合此连接。因为HTTP的设计方式是服务器仅响应请求,这阻止了服务器自己发出请求。还有其他解决方案提供两种方式的连接(服务器到客户端和客户端到服务器同时)。
WebSocket
是我想到的第一件事。当然ZeroMQ
也可以做到这一点。