Learning Python Network Programming

(Sean Pound) #1
Chapter 8

An eventlet-based chat server


The eventlet library provides a high-level API for event-driven programming, but
it does so in a style that mimics the procedural, blocking-IO style that we used in our
multithreaded servers. The upshot is that we can effectively take our multithreaded
chat server code, make a few minor modifications to it to use eventlet instead,
and immediately gain the benefits of the event-driven model!


The eventlet library is available in PyPi, and it can be installed with pip,
as shown here:


$ pip install eventlet


Downloading/unpacking eventlet


The eventlet library automatically falls back to select if poll is not
available, so it will run properly on Windows.

Once it's installed, create a new file called 4.1-chat_server-eventlet.py and save
the following code in it:


import eventlet
import eventlet.queue as queue
import tincanchat

HOST = tincanchat.HOST
PORT = tincanchat.PORT
send_queues = {}

def handle_client_recv(sock, addr):
""" Receive messages from client and broadcast them to
other clients until client disconnects """
rest = bytes()
while True:
try:
(msgs, rest) = tincanchat.recv_msgs(sock)
except (EOFError, ConnectionError):
handle_disconnect(sock, addr)
break
for msg in msgs:
msg = '{}: {}'.format(addr, msg)
print(msg)
broadcast_msg(msg)
Free download pdf