Socket Echo Server¶
In this assignment you will build an echo server using Python sockets.
Tasks¶
Create a new repository called http-server
in GitHub for this work.
Make sure it contains an appropriate LICENSE
, README.md
, and .gitignore
file.
Make a branch echo
from master
to do your work for this assignment.
Create two new python modules in your repository, client.py
and server.py
.
In addition, create a test_servers.py
file to contain your tests.
Add a setup.py
file so you can install your package.
And a tox.ini
file so you can run your tests in both Python 2.7 and Python 3.6.
The Client¶
In your client.py
file, create a function client
which takes one required parameter, message
.
When called, the client
function should open a socket connection to the server.
It should send the message passed as an argument to the server through the socket.
It should accumulate any reply sent by the server into a string.
Once the full reply is received, it should close the socket and return the message.
This file should contain an if __name__ == "__main__":
block so it can be run as a script.
This script should be called from the command line with a single argument which is the message to send.
The script should print the reply from the server to the terminal where the script was run:
$ python client.py "this is the message to send"
this is the reply received.
The Server¶
In your server.py
file, create a function server
which takes no arguments.
When run, this function should start a server running.
The server should continue running, sending responses for any messages it receives.
When the user presses ctrl-d
(the keyboard interrupt), the server should cleanly exit (meaning raises no exceptions).
All open sockets should be closed.
The server should accept incoming connections. It should receive messages sent from those connections and echo them back exactly as received. Once an entire message has been received and echoed, the connection to the client should be closed.
The server must remain running and accepting connections.
Testing¶
The tests you write for this work may be considered functional tests, as opposed to unit tests.
They will test the system, rather than either individual function.
Your tests should use the client
function from client.py
to send test messages and return the replies sent by the server.
They should assert that the message sent is identical to the reply received.
The following conditions should be tested:
- messages shorter than one buffer in length
- messages longer than several buffers in length
- messages that are an exact multiple of one buffer in length
- messages containing non-ascii characters
Submitting Your Work¶
When you are finished implementing your server and client and all your tests are passing both in Python 2 and Python 3, push your changes to the echo
branch to github.
Open a pull request from the echo
branch to your master.
Paste the URL of this pull request as your submission.
As with every primary submission, use the Comments feature for this submission to add questions, comments and reflections on the work you have done so far.
Once you have submitted your assignment, you may merge your echo
branch back to master in preparation for the next step in this assignment series.