Rambo partyush
Rambo partyush

Reputation: 83

How to get address of sender in PYZMQ socket? (Multiple client, 1 server)

I have created a server that has a socket bound to 2 ports. Now there are 2 clients each of which is connected to 1 port. The server receives random numbers from both clients, but I want the server to know from which port it is receiving the data. I know it maybe a pretty stupid question and I am new to this. Please help !

Server

    import zmq
    context = zmq.Context()
    socket = context.socket(zmq.REP)
    socket.bind("tcp://*:5555") # A single port is used for the communication

    socket.bind("tcp://*:5556") # A single port is used for the communication
    #  Wait for next request from client
    while True:

        try:
            message = socket.recv()
            msg = message.decode("utf-8") # decode the bytes to string
            print("Random Integer Received: %s" % msg) # display received string
            #  Send reply back to client
            socket.send_string("Random Integer Received from client 1")
            #sock_add = socket.getaddrinfo()
        except zmq.ZMQError as e:
            print('Unable to receive: %s', e)

Client 1 (client 2 has identical code with port address 5556)

    import zmq
    import time
    import numpy as np
    #import pandas as pd

    context = zmq.Context()
    num = np.random.randint(150) # Generates a random integer

    #  Socket to talk to server
    print("Connecting to server…")
    socket = context.socket(zmq.REQ)
    socket.connect("tcp://localhost:5555")

    #  Do 100 requests, waiting each time for a response
    for request in range(100):
        k = np.random.randint(150)  # Generates a random integer
        print("Sending request %s …" % request, "sent no is %s" % k)
        socket.send_string(str(k))

        #  Get the reply.
        message = socket.recv()
        print("Received reply %s [ %s ]" % (request, message))
        time.sleep(5)  # delay of 5 seconds

Please help !!

Upvotes: 1

Views: 872

Answers (1)

lhd
lhd

Reputation: 436

I would simply add the information that you need (port) into the message itself and use the zmq.SNDMORE...

Something like:

socket.send_string("Port 5555", flags=zmq.SNDMORE)
socket.send_string(str(k)) # or 5556

And then, on the server side, you can see which port the messages is coming from based on the message itself.

Upvotes: 2

Related Questions