我在 python 中创建了一个 TCP 客户端,希望它能监听不断向它抛出的数据流。但它在读取 10 个字节后挂起。
python :
import socket
TCP_IP = '10.0.0.25'
TCP_PORT = 31031
BUFFER_SIZE = 4096
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
while 1:
data = s.recv(BUFFER_SIZE)
print (data)
输出:
b'\xff\x00\x00\x00\x00\x00\x00\x00\x01\x7f'
ZMQ:
class ZmqClient(object):
def __init__(self):
try:
self.host = '10.0.0.25'
self.port = 31031
context = zmq.Context()
self.socket = context.socket(zmq.SUB)
self.socket.connect("tcp://{0}:{1}".format(self.host, self.port))
self.socket.setsockopt_string(zmq.SUBSCRIBE, "")
except Exception as e:
logger.exception("CAN'T ESTABLISH CONNECTION WITH ZMQ SERVER : %s" % e)
def startReceiving(self):
while 1:
SocketData = self.socket.recv(4096)
print(SocketData)
if __name__ == "__main__":
z = ZmqClient()
z.startReceiving()
输出:
b'\x04\x00\x00\x00BSE\x00\x00\x00\x00\x00\x00\x00\x00\x01\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x04\x00\x00\x00BSE\x00\x00\x00\x00\x00\x00\x00\x00\x01\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
我想在 Python 中复制 ZMQ 的行为,实际上我正在为 tornado 编写一个 TCP 客户端并发现它有同样的问题,所以能够在简单的 Python 客户端中复制它。
我做错了什么?
最佳答案
你有很多错误。 首先,ZeroMQ 有自己的服务器配置来与 SUB 客户端交互。
其次,你的socket服务器配置有误。您正在将其设置为客户端。
如果你想使用 zmq,我留给你一个正确的客户端/服务器示例(PUB/SUB Pattern):
ZMQserver.py
# -*- coding: utf-8 -*-
import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:31031")
while True:
socket.send_string("Hola mundo!")
time.sleep(1)
ZMQclient.py
# -*- coding: utf-8 -*-
import zmq
host = 'localhost'
port = 31031
# Socket to talk to server #
context = zmq.Context()
socket = context.socket(zmq.SUB)
print("Receiving messages...")
socket.connect("tcp://{}:{}".format(host, port))
socket.setsockopt_string(zmq.SUBSCRIBE, u'')
while True:
msg = socket.recv_string()
print msg
在此示例中,服务器每秒向所有订阅它的客户端发送消息。
对于你想做的事情,zmq 是最好的选择之一。
关于python-3.x - Python TCP 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49811029/