这段代码效果很好:
import zmq, json, time
def main():
context = zmq.Context()
subscriber = context.socket(zmq.SUB)
subscriber.bind("ipc://test")
subscriber.setsockopt(zmq.SUBSCRIBE, '')
while True:
print subscriber.recv()
def main():
context = zmq.Context()
publisher = context.socket(zmq.PUB)
publisher.connect("ipc://test")
while True:
publisher.send( "hello world" )
time.sleep( 1 )
但是这段代码doesn't* work:
import zmq, json, time
def recv():
context = zmq.Context()
subscriber = context.socket(zmq.SUB)
subscriber.bind("tcp://localhost:5555")
subscriber.setsockopt(zmq.SUBSCRIBE, '')
while True:
print subscriber.recv()
def send():
context = zmq.Context()
publisher = context.socket(zmq.PUB)
publisher.connect("tcp://localhost:5555")
while True:
publisher.send( "hello world" )
time.sleep( 1 )
它会引发此错误:
ZMQError:没有这样的设备
为什么 Zeromq 不能使用 localhost 接口?
只能在同一台机器上的IPC上使用吗?
正如@fdb 指出的:
问题出在一行:
subscriber.bind("tcp://localhost:5555")
尝试更改为:
subscriber.bind("tcp://127.0.0.1:5555")
然而,这需要更多的解释来理解原因。
的文档zmq_bind http://api.zeromq.org/2-1:zmq-bind解释(粗体强调我的):
The endpointargument 是一个由两部分组成的字符串,如下所示:transport://address
. The 运输部分指定底层
要使用的传输协议。的含义address部分是具体的
选择的底层传输协议。
由于您的示例使用 tcp 作为传输协议,因此我们查看zmq_tcp http://api.zeromq.org/2-1:zmq-tcp发现的文档(再次强调我的):
使用 zmq_bind() 为套接字分配本地地址时tcp运输、endpoint应被解释为界面后跟冒号和要使用的 TCP 端口号。
接口可以通过以下任一方式指定:
- 通配符*,表示所有可用的接口。
- 分配给接口的主 IPv4 地址,在其数字表示中.
- 由操作系统定义的接口名称。
因此,如果您不使用通配符或接口名称,则意味着您必须使用数字形式的 IPv4 地址(而不是 DNS 名称)。
请注意,这仅适用于使用zmq_bind
!另一方面,使用 DNS 名称是完全可以的zmq_connect
正如稍后在文档中讨论的zmq_tcp http://api.zeromq.org/2-1:zmq-tcp:
使用 zmq_connect() 将套接字连接到对等地址时
TCP 传输,端点应被解释为对等地址
后跟冒号和要使用的 TCP 端口号。
对等地址可以通过以下任一方式指定:
- 对等方的 DNS 名称。
- 对等方的 IPv4 地址,采用数字表示形式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)