繁体   English   中英

在同一台计算机上具有多个客户端的TCP over RPC

[英]RPC over TCP with multiple clients on same machine

我正在使用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并循环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也可以做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM