Learning Python Network Programming

(Sean Pound) #1

Client and Server Applications


Concurrent I/O


If you're adventurous, then you may have tried connecting to our server using more
than one client at once. If you tried sending messages from both of them, then you'd
have seen that it does not work as we might have hoped. If you haven't tried this,
then give it a go.


A working echo session on the client should look like this:


Type message, enter to send. 'q' to quit


hello world


Sent message: hello world


Received echo: hello world


Closed connection to server


However, when trying to send a message by using a second connected client, we'll
see something like this:


Type message, enter to send. 'q' to quit


hello world


Sent message: hello world


The client will hang when the message is sent, and it won't get an echo reply.
You may also notice that if we send a message by using the first connected client,
then the second client will get its response. So, what's going on here?


The problem is that the server can only listen for the messages from one client at a
time. As soon as the first client connects, the server blocks at the socket.recv() call
in tincanchat.recv_msg(), waiting for the first client to send a message. The server
isn't able to receive messages from other clients while this is happening and so, when
another client sends a message, that client blocks too, waiting for the server to send
a reply.


This is a slightly contrived example. The problem in this case could easily be fixed
in the client end by asking the user for an input before establishing a connection to
the server. However in our full chat service, the client will need to be able to listen
for messages from the server while simultaneously waiting for user input. This is not
possible in our present procedural setup.


There are two solutions to this problem. We can either use more than one thread
or process, or use non-blocking sockets along with an event-driven architecture.
We're going to look at both of these approaches, starting with multithreading.

Free download pdf