Sth*_*the 0 python sockets linux tcp zeromq
我不确定我这样做是否正确,但我希望能够从正常的 TCP 连接向运行 ZMQ 的服务器发送消息。服务器在端口上运行 Python ZMQ5555使用TCP transport. 我希望能够使用使用传统 TCP 的不同客户端(Python、Java、PHP)向它发送消息。这是我到目前为止:
服务器
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")
while True:
message = socket.recv()
print message
socket.send('{"name":"someone"}')
Run Code Online (Sandbox Code Playgroud)
客户
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 5555))
s.send('Hello, World!')
data = s.recv(1024)
print data
Run Code Online (Sandbox Code Playgroud)
data在客户端上打印并没有给我我期待的信息。我得到这个:?。我试着bytes(data).decode('utf8')思考我得到的是一个字节数组,但我收到以下错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
我只是想知道:这可能吗?还是我做错了什么?另外,推荐吗?
我不在客户端上使用 ZMQ 的原因是我想减少依赖项的数量(ZeroMQ 就是其中之一)。
感谢您的帮助。
ZeroMQ 是一个位于 TCP 之上的协议(好吧,从技术上讲,ZMTP 是一个协议;0MQ 是实现 ZMTP 协议的库,而 ZeroMQ 是 0MQ 的 Python 实现……)。它所做的所有信令以及所有帧(将字节流分成单独的消息)都是通过通过套接字发送字节来完成的。不知道如何进行 ZeroMQ 信号和帧处理的客户端只会看到一堆垃圾。
您正在尝试做的事情就像尝试编写一个仅读取套接字而不了解 HTTP 的 Web 客户端一样。你会得到一堆你不知道如何处理的框架材料。唯一的区别是,在 HTTP 的情况下,帧有时(但不总是——你可以有 MIME 信封、gzip 传输编码、分块传输,……)只是一堆人类可读的 ASCII 出现在数据之前,而使用 ZMTP,它永远不会是人类可读的……
如果您想通过普通 TCP 套接字发送数据,则必须通过在服务器端创建一个普通 TCP 套接字并调用其send(或sendall等)方法来实现。如果您想通过 ZMTP 通道发送数据,您必须通过在客户端解析 ZMTP 或使用为您执行此操作的库(如 ZeroMQ)来实现。
要记住的另一件事是,与 ZMTP 不同,TCP 不是面向消息的协议;所有 TCP 发送的都是字节流。从接收方来说,没有办法知道一个发送何时结束而下一个发送何时开始。因此,对于除了“发送请求、获得响应、挂断”协议之外的几乎所有内容,您都需要编写自己的某种框架。这可以像“消息是没有换行符的字符串一样简单,每条消息都由换行符分隔”(在这种情况下,您可以只使用socket.makefile),但通常消息格式必须更复杂,或者您有发送“命令”而不仅仅是数据等。
由于tdelaney 的回答已被删除(我认为这意味着它对 10K 代表以下的任何人都是不可见的),并且有一个有用的建议,我将在这里重复一遍,应有的信用:您可以(使用 ZeroMQ 库)写一段中间件将 ZMTP 与服务器通信,但您自己的基于 TCP 的简单协议与客户端通信。ZeroMQ 是专门为使这变得相当容易而设计的;正如 tdelaney 所说,它“有点像乐高,你通过构建不同的通信部件来构建强大的通信基础设施。并非所有部件都需要是 zeromq。”
| 归档时间: |
|
| 查看次数: |
1646 次 |
| 最近记录: |