Last active
January 2, 2018 15:01
-
-
Save biggers/d5cd11b0b010f64cd821dad2c90fa450 to your computer and use it in GitHub Desktop.
"continously-running" Tornado TCP client example -- sends to 'tornado/demos/tcpecho/server.py'
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
import logging | |
from tornado.options import options, define | |
from tornado import gen | |
from tornado.tcpclient import TCPClient | |
from tornado.iostream import StreamClosedError | |
from tornado.ioloop import IOLoop | |
define("host", default="127.0.0.1", help="TCP server host") | |
define("port", default=9888, help="TCP port to connect to") | |
define("sleep_for", default=2.0, help="Sleep time before next message-send") | |
define("delay", default=1.5, help="delay for re(run) callback") | |
logger = logging.getLogger(__name__) | |
class EchoClient(TCPClient): | |
""" | |
"continously-running" TCP client - sends to 'tornado/demos/tcpecho/server.py' | |
Derived from: tornado/demos/tcpecho/client.py | |
""" | |
def get_random_word(self, length=10): | |
""" kudos to StackOverflow... | |
""" | |
import random | |
random_word = "" | |
for i in range(length): | |
random_word += (str(chr(random.randint(97,122)))) | |
return random_word | |
@gen.coroutine | |
def run(self, loop, service=None): | |
logger.info("in EchoClient.run() ...") | |
if service is None: | |
service = yield TCPClient().connect(options.host, options.port) | |
try: | |
our_msg_bytes = self.get_random_word() +'\n' | |
yield service.write(our_msg_bytes.encode()) | |
logger.info("Sent to server: {}".format(our_msg_bytes.strip())) | |
data = yield service.read_until(b"\n") | |
logger.info("Response: %s", data.decode().strip()) | |
except StreamClosedError: | |
logger.warning("Lost our server at host %s", options.host) | |
loop.stop() | |
except Exception as e: | |
print(e) | |
# reschedule.me! | |
loop.call_later(options.delay, self.run, loop, service) | |
if __name__ == "__main__": | |
options.parse_command_line() | |
# import pdb; pdb.set_trace() | |
# pp options.as_dict() | |
client = EchoClient() | |
logger.info("Sending data on TCP port %d", options.port) | |
loop = IOLoop.current() | |
loop.call_later(options.delay, client.run, loop) | |
loop.start() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment