6 from threading
import Thread, Event
18 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
19 udp_socket.bind((
'', options.port))
21 print "Discovering device with UUID:%s via UDP broadcast ..." % options.uuid
23 recv_data, addr = udp_socket.recvfrom(2048)
26 info = json.loads(recv_data)
27 if info[
'uuid'] != options.uuid:
30 server_address = (info[
'ip'], info[
'remote_terminal_port'])
31 print "Discovered device TCP server at:%s:%d" % server_address
37 print "Starting %d TCP clients" % options.num_clients
42 for client
in range(0, options.num_clients):
44 Thread(name=
'Client:%d' % client,
45 target=tcp_client_handler,
46 args=(running, options, server_address, client)).start()
47 except Exception
as e:
48 print "Exception: %s" % e
57 print "Exiting app ...\n\n\n" 63 def print_client_log(client_id, msg):
64 m =
"[Client:%d] " % client_id
68 def tcp_client_handler(running, options, server_address, client_id):
69 while running.is_set():
70 close_after_waiting = bool(random.getrandbits(1))
72 should_rx_data = bool(random.getrandbits(1))
75 sleep_time = random.uniform(options.wait_time_min, options.wait_time_max)
77 message_length = int(random.uniform(options.data_size_min, options.data_size_max))
79 chunk_length = int(random.uniform(options.data_chunk_size_min, max(options.data_chunk_size_max,message_length)))
82 print_client_log(client_id,
"Connecting to %s:%d" % server_address)
83 s.connect(server_address)
84 print_client_log(client_id,
"Connected.")
87 msg +=
" Message length: %d bytes\n" % message_length
88 msg +=
" Chunk length: %d bytes\n" % chunk_length
89 msg +=
" Sleep time: %1.3fs\n" % sleep_time
90 msg +=
" Read RX data: %s\n" % (
"Yes" if should_rx_data
else "No")
91 msg +=
" Close after waiting: %s" % (
"Yes" if close_after_waiting
else "No")
92 print_client_log(client_id, msg)
95 tx_msg =
'%d' % client_id
96 tx_msg *= message_length
98 while len(tx_msg) > 0:
99 chunk = tx_msg[:chunk_length]
100 tx_msg = tx_msg[chunk_length:]
101 while len(chunk) > 0:
106 while message_length > 0:
107 rx_msg = s.recv(min(message_length, 4096))
109 print_client_log(client_id,
"Server closed connection")
111 message_length -= len(rx_msg)
112 print_client_log(client_id,
"RX data remaining: %d" % message_length)
115 if close_after_waiting:
116 time.sleep(sleep_time)
119 print_client_log(client_id,
"Connection closed")
121 if not close_after_waiting:
122 time.sleep(sleep_time)
127 if __name__ ==
"__main__":
128 cli = optparse.OptionParser(description=
'This script randomly opens and closes TCP server clients.\n' +
129 'When the client socket is opened, it random blasts data')
131 cli.add_option(
'--uuid',
'-u',
133 help=
"required: Device's UUID, the device running the example TCP echo server app")
135 cli.add_option(
'--port',
'-p',
138 help=
'UDP port device broadcasts its connection info [default: %default]')
140 cli.add_option(
'--wait_time_min',
143 help=
'Lower limit on range in seconds to wait before restarting TCP client loop [default: %default]')
145 cli.add_option(
'--wait_time_max',
148 help=
'Upper limit on range in seconds to wait before restarting TCP client loop [default: %default]')
150 cli.add_option(
'--data_size_min',
153 help=
'Lower limit on rangein bytes of client TX message [default: %default]')
154 cli.add_option(
'--data_size_max',
157 help=
'Upper limit on range in bytes of client TX message [default: %default]')
159 cli.add_option(
'--data_chunk_size_min',
162 help=
'Lower limit on range in bytes to chunk the TX message (this cause the TCP data to be sent in multiple packets) [default: %default]')
164 cli.add_option(
'--data_chunk_size_max',
167 help=
'Upper limit on range in bytes to chunk the TX message (this cause the TCP data to be sent in multiple packets) [default: %default]')
169 cli.add_option(
'--num_clients',
'-n',
172 help=
'Maximum number of connected clients [default: %default]')
174 options, _ = cli.parse_args()
176 if options.uuid ==
None:
178 raise Exception(
"Must supply '--uuid' argument")