In Python ZMQ publisher/subscriber sample template, the publisher uses .bind()
method and the subscriber uses .connect()
method, that connected to the bind IP address.
But we can replace .bind()
and .connect()
each with the other.
My question is that what is the difference between two cases that determined below?
(two scripts in these cases work fine)
The first case, as default:
pub1.py:
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)
sub1.py:
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')
And the second case, as the modified setup, that reversed the use of the .connect()
and .bind()
methods:
pub2.py:
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)
sub2.py:
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')
There is no difference here (single publisher and subscriber), but in other scenarios (multi publishers or subscribers), there is a difference depending on your policy:
ZMQ
, and the Server must subscribe that data from Machine1 and Machine2:Machine1 --> has a publisher (with .connect(Server IP)
)
Machine2 --> has a publisher (with .connect(Server IP)
)
Server --> has a subscriber (with .bind(Server IP/Self IP)
)
As you can see in the mentioned scenario we used the second case in the question.
.bind()
method in the publisher and place .connect()
method in the subscribers (first case in the question).[NOTE]:
.bind()
method doesn't support the localhost
as an IP, while .connect()
method could be connected to each IP address that defined in .bind()
method: Why doesn't zeromq work on localhost?
Here is another example of changing .bind()
and .connect()
locate: This-Link
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With