80 lines
2.6 KiB
Python
80 lines
2.6 KiB
Python
from contextlib import closing
|
|
from msgbus.client import MsgbusSubClient
|
|
from time import time, sleep
|
|
from threading import Thread
|
|
|
|
|
|
def pong(host, port):
|
|
"""
|
|
Subscribe to the ping channel and send pongs in reply
|
|
"""
|
|
with closing(MsgbusSubClient(host, port)) as client:
|
|
client.sub("ping")
|
|
while True:
|
|
_, msg = client.recv()
|
|
client.pub("pong", "{} {}".format(msg, time()))
|
|
print("pong(): >< {} {}".format(_, msg))
|
|
|
|
|
|
def ping(host, port, count=5, interval=1):
|
|
"""
|
|
Send a ping and wait for the reply. In a loop
|
|
"""
|
|
with closing(MsgbusSubClient(host, port)) as client:
|
|
client.prepare_pub()
|
|
client.sub("pong")
|
|
sleep(2)
|
|
|
|
def ping_recver():
|
|
recvtime = 0
|
|
while True:
|
|
_, msg = client.recv()
|
|
recvtime = time()
|
|
seq, msgtime, remotetime = msg.split(" ")
|
|
msgtime = float(msgtime)
|
|
remotetime = float(remotetime)
|
|
transittime = recvtime - msgtime
|
|
# out = remotetime - msgtime
|
|
# back = recvtime - remotetime
|
|
# These aren't printed because clock sync imperfection makes them unreliable
|
|
print("ping(): < {} {} rtt: {:f}\n".format(_, seq, round(transittime, 8)))
|
|
|
|
recv = Thread(target=ping_recver)
|
|
recv.daemon = True
|
|
recv.start()
|
|
|
|
seq = 0
|
|
while seq < count:
|
|
print("ping(): > ping {}".format(seq))
|
|
client.pub("ping", "{} {}".format(seq, time()))
|
|
sleep(interval)
|
|
seq += 1
|
|
|
|
sleep(interval * 2)
|
|
|
|
|
|
def main():
|
|
import argparse
|
|
parser = argparse.ArgumentParser(description="send a message to a msgbus server")
|
|
parser.add_argument("-i", "--host", default="127.0.0.1", help="host to connect to")
|
|
parser.add_argument("-p", "--port", default=7003, help="port to connect to")
|
|
parser.add_argument("-m", "--mode", choices=["ping", "pong"], required=True, help="client mode")
|
|
parser.add_argument("-c", "--count", type=int, default=5, help="how many pings")
|
|
parser.add_argument("--interval", type=float, default=1, help="ping interval")
|
|
args = parser.parse_args()
|
|
|
|
if args.mode == "ping":
|
|
ping(args.host, args.port, args.count, args.interval)
|
|
elif args.mode == "pong":
|
|
pong(args.host, args.port)
|
|
|
|
# python3 examples/ping.py -m pong -i 127.0.0.1 -p 7100 &
|
|
# python3 examples/ping.py -m ping -i 127.0.0.1 -p 7100
|
|
# ping(): > ping hello
|
|
# pong(): >< ping hello
|
|
# ping(): < pong hello rtt: 0.000046
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|