在Python ZMQ发布/订阅的示例模板,发布商使用.bind()
方法和用户使用.connect()
方法,连接到所述绑定IP地址。
但是,我们可以更换.bind()
,并与其他.connect()
每个。
我的问题是,什么是两种情况之下确定的区别? (在这种情况下两个脚本做工精细)
第一种情况下,默认:
普遍1.朋友:
import zmq
import time
from datetime import datetime
def create_pub_socket():
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://127.0.0.1:9002") # notice
return socket
def publish(pub_socket):
message = {
'data': 'hi my name is benyamin',
'time': datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
}
pub_socket.send_json(message, 0)
return message
if __name__ == '__main__':
socket = create_pub_socket()
while True:
print('\n')
print('publisher: ', publish(socket))
time.sleep(1)
苏北1.朋友:
import zmq
if __name__ == '__main__':
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.setsockopt(zmq.SUBSCRIBE, "")
socket.connect("tcp://127.0.0.1:9002") # notice
while True:
data = socket.recv_json()
print('subscriber: ', data)
print('\n')
和第二种情况下,作为修正的设置,即反转使用的.connect()
和.bind()
方法:
普遍2.朋友:
import zmq
import time
from datetime import datetime
def create_pub_socket():
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.connect("tcp://127.0.0.1:9002") # notice
return socket
def publish(pub_socket):
message = {
'data': 'hi my name is benyamin',
'time': datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
}
pub_socket.send_json(message, 0)
return message
if __name__ == '__main__':
socket = create_pub_socket()
while True:
print('\n')
print('publisher: ', publish(socket))
time.sleep(1)
苏北2.朋友:
import zmq
if __name__ == '__main__':
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.setsockopt(zmq.SUBSCRIBE, "")
socket.bind("tcp://127.0.0.1:9002") # notice
while True:
data = socket.recv_json()
print('second subscriber: ', data)
print('\n')
在这里,但在其他情况下,有差异无显着差异取决于你的政策:
即假设有两个客户端(MACHINE1,机器2)和服务器。
每个客户端必须使用ZMQ
公布的数据,服务器必须订阅来自MACHINE1和机器2数据:
.connect(Server IP)
).connect(Server IP)
).bind(Server IP/Self IP)
)正如你可以在场景中提到的,我们看到在第二种情况下使用(在提到的问题)。
[注意]:
.bind()
方法仅与自IP或127.0.0.1
接受,但.connect()
方法可连接到在.bind()
方法中定义的每个IP地址:Why doesn't zeromq work on localhost?.bind()
的另一个例子.connect()
定位:This
-Link操作高度差的,没有。
设置视角差异 - .bind()
方法不需要知道实际的地址(使用通配符expansio技巧等),.connect()
方法必须知道目标地址,它会开始尝试.connect()
到。
交通运输类/可扩展的正式沟通模式的原型 - 有这样的情况,实例化时,一些订单/成为RTO是强制性的正确原型的服务,所以,是的,有差异,当一个人,.bind()
已经变得更早RTO,任何远程前.connect()
可能有成功的机会。
附加可用于配置.bind()
侧具体特点 - 是的差异,其中3.2+开始有些更近ZeroMQ API的版本增加了一些新的访问控制和类似的防御方案供.bind()
端节点的最后一个主集,从而帮助管理,一旦进入公共互联网曝光手法的风险太多了。