use*_*428 65 python localhost zeromq
这段代码效果很好:
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 )
Run Code Online (Sandbox Code Playgroud)
但是这段代码不起作用:
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 )
Run Code Online (Sandbox Code Playgroud)
它引发了这个错误:
ZMQError:没有这样的设备
为什么,zeromq不能使用localhost接口?
它只适用于同一台机器上的IPC吗?
acu*_*ich 161
正如@fdb指出:
问题在于:
subscriber.bind("tcp://localhost:5555")
Run Code Online (Sandbox Code Playgroud)
尝试改为:
subscriber.bind("tcp://127.0.0.1:5555")
Run Code Online (Sandbox Code Playgroud)
然而,理解为什么这需要更多的解释.
zmq_bind的文档解释了(大胆强调我的):
的端点参数是由两个部分组成如下的字符串:
transport://address.所述传输部分指定底层传输协议来使用.地址部分的含义特定于所选的基础传输协议.
由于您的示例使用tcp作为传输协议,因此我们在zmq_tcp文档中查找(再次强调我的):
使用带有tcp传输的zmq_bind()为套接字分配本地地址时 ,端点应解释为接口 后跟冒号和要使用的TCP端口号.
可以通过以下任一方式指定接口:
- 通配符*,表示所有可用接口.
- 分配给接口的主IPv4地址,以其数字表示形式.
- 接口名称,由操作系统定义.
因此,如果您不使用通配符或接口名称,则表示您必须使用数字形式的IPv4地址(而不是DNS名称).
注意,这只适用于使用zmq_bind!另一方面,使用DNS名称是完全正确的,zmq_connect如后面zmq_tcp文档中所述:
使用带有tcp传输的zmq_connect()将套接字连接到对等地址时,端点应解释为对等地址,后跟冒号和要使用的TCP端口号.
可以通过以下任一方式指定对等地址:
- 对等体的DNS名称.
- 对等体的IPv4地址,以其数字表示形式.
fdb*_*fdb 43
问题在于:
subscriber.bind("tcp://localhost:5555")
Run Code Online (Sandbox Code Playgroud)
尝试改为:
subscriber.bind("tcp://127.0.0.1:5555")
Run Code Online (Sandbox Code Playgroud)