<p>问题出在用户端。最初,订阅者过滤掉所有消息,直到设置了过滤器。使用<code>socket.setsockopt(opt, value)</code>函数将其存档。
<code>pyZMQ</code>的描述对该函数的使用不是很清楚:</p>
<blockquote>
<p><strong>getsockopt(opt)</strong> get default socket options for new sockets created by
this Context</p>
</blockquote>
<p>但是<code>zmq_setsockopt</code>函数的文档非常清楚(<a href="http://api.zeromq.org/2-1:zmq-setsockopt" rel="nofollow">see here</a>):</p>
<blockquote>
<p><strong>int zmq_setsockopt (void *socket, int option_name, const void *option_value, size_t option_len)</strong></p>
<p>...</p>
<p><strong><code>ZMQ_SUBSCRIBE</code></strong>: Establish message filter The <code>ZMQ_SUBSCRIBE</code> option shall establish a new message filter on a <code>ZMQ_SUB</code> socket.
Newly created <code>ZMQ_SUB</code> sockets shall filter out all incoming
messages, therefore you should call this option to establish an
initial message filter.</p>
</blockquote>
<p>所以解决方案是用<code>socket.setsockopt(zmq.SUBSCRIBE,filter)</code>设置一个过滤器,其中filter是要过滤的字符串。使用<code>filter=''</code>显示所有消息。像<code>filter='ERROR'</code>这样的筛选器将只显示错误消息,而不显示其他所有类型,如<code>WARNING</code>、<code>INFO</code>或{<cd9>}。在</p>
<p>这样,<code>sub_client()</code>函数如下所示:</p>
<pre><code>import time
import zmq
def sub_client():
port = "12344"
context = zmq.Context()
socket = context.socket(zmq.SUB)
ssocket.connect("tcp://127.0.0.1:%s" % port)
socket.setsockopt(zmq.SUBSCRIBE,'')
# Process 30 updates
print "Listening to publishers..."
for i in range (30):
print "Listening to publishers..."
message = socket.recv()
print "Received error #%s: %s" % (str(i), message)
time.sleep(1)
sub_client()
</code></pre>