79 lines
2.2 KiB
Python
79 lines
2.2 KiB
Python
|
|
|
|
#
|
|
# Lazy Pirate client
|
|
# Use zmq_poll to do a safe request-reply
|
|
# To run, start lpserver and then randomly kill/restart it
|
|
#
|
|
# Author: Daniel Lundin <dln(at)eintr(dot)org>
|
|
#
|
|
from __future__ import print_function
|
|
from random import randint
|
|
|
|
import zmq
|
|
|
|
|
|
REQUEST_TIMEOUT = 2500
|
|
REQUEST_RETRIES = 3
|
|
SERVER_ENDPOINT = "tcp://localhost:5555"
|
|
|
|
context = zmq.Context(1)
|
|
|
|
print("I: Connecting to server…")
|
|
client = context.socket(zmq.REQ)
|
|
client.connect(SERVER_ENDPOINT)
|
|
|
|
poll = zmq.Poller()
|
|
poll.register(client, zmq.POLLIN)
|
|
|
|
sequence = 0
|
|
retries_left = REQUEST_RETRIES
|
|
while retries_left:
|
|
sequence += 1
|
|
request = str(sequence).encode()
|
|
frames = [b"count", b"req", request]
|
|
client.send_multipart(frames)
|
|
print("I: Sending ({}) as: {}".format(request, frames))
|
|
#client.send(request)
|
|
|
|
expect_reply = True
|
|
while expect_reply:
|
|
socks = dict(poll.poll(REQUEST_TIMEOUT))
|
|
if socks.get(client) == zmq.POLLIN:
|
|
print("get reply")
|
|
frames = client.recv_multipart()
|
|
reply = int(frames[1])
|
|
|
|
if not reply:
|
|
break
|
|
if int(reply) == sequence:
|
|
print("I: Server replied OK (%s)" % reply)
|
|
retries_left = REQUEST_RETRIES
|
|
expect_reply = False
|
|
elif int(reply) < sequence:
|
|
print("W: Answer arrived LATE (%s)" % reply)
|
|
elif int(reply) > sequence:
|
|
print("W: arrived EARLY")
|
|
|
|
else:
|
|
print("E: Malformed reply from server: %s" % reply)
|
|
|
|
else:
|
|
print("W: No response from server, retrying…")
|
|
# Socket is confused. Close and remove it.
|
|
client.setsockopt(zmq.LINGER, 0)
|
|
client.close()
|
|
poll.unregister(client)
|
|
retries_left -= 1
|
|
if retries_left == 0:
|
|
print("E: Server seems to be offline, abandoning")
|
|
break
|
|
print("I: Reconnecting and resending (%s)" % request)
|
|
# Create new connection
|
|
client = context.socket(zmq.REQ)
|
|
client.connect(SERVER_ENDPOINT)
|
|
poll.register(client, zmq.POLLIN)
|
|
client.send_multipart([b"count", request])
|
|
|
|
context.term()
|