2

在机器 1 上运行的脚本

import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.bind("tcp://127.0.0.1:5000")
print "socket bound"

while True:
    print "Waiting for message"
    message = socket.recv()
    print "message received: " + str(message)

这个脚本到达 socket.recv() 然后永远不会从那个调用返回。

发送数据的进程在 machine2 上运行

import zmq

context = zmq.Context()
socket = context.socket(zmq.PUB)
print "socket created"
socket.connect("tcp://machine2:5000")
print "socket connected"

for i in range(1, 3):
    print "About to send " + str(i)
    socket.send("Hello " + str(i))
    print "Sent " + str(i)

print "About to close socket"
socket.close()

print "Socket closed"

执行到完成,但从未完成......

$ python bar.py
socket created
socket connected
About to send 1
Sent 1
About to send 2
Sent 2
About to close socket
Socket closed

我显然做错了,如何创建一个“队列”来接收来自远程主机上发布的多条消息?

4

3 回答 3

3

只需要正确绑定套接字并使用 setsockopt 设置选项,如下所示。没事的..

import zmq
import socket



context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.setsockopt(zmq.SUBSCRIBE, "")

socket.bind("tcp://*:5000")
print "socket bound"

while True:
    print "Waiting for message"
    message = socket.recv()
    print "message received: " + str(message)
于 2013-05-15T11:12:07.600 回答
2

这是一个使用 PUB 绑定和 SUB 连接的工作示例 - 先启动发布者,然后启动订阅者:

发布.py

import time
import zmq

context = zmq.Context()
socket = context.socket(zmq.PUB)
print "socket created"
socket.bind('tcp://*:5000')
print "socket connected"

channel = '1001'
i = 0
while True:
    message = 'Hello %s' % i
    socket.send("%s %s" % (channel, message))
    print "Published: %s " % message
    time.sleep(0.5)
    i += 1

print "About to close socket"
socket.close()
print "Socket closed"

sub.py(用适当的主机名/IP替换发布者):

import zmq

context = zmq.Context()
channel = '1001'
socket = context.socket(zmq.SUB)
socket.setsockopt(zmq.SUBSCRIBE, 'channel')
socket.connect('tcp://publisher:5000')
print "socket connected"

while True:
    print "Waiting for message"
    message = socket.recv()
    print "message received: ", message
于 2013-05-14T19:45:52.680 回答
0

看起来我需要使一个插座成为 PULL 插座,另一个成为 PUSH 插座。

于 2013-05-14T19:29:44.023 回答