desired. If :meth:`handle_request` receives no incoming requests within the
timeout period, the :meth:`handle_timeout` method is called.
+
There are various server methods that can be overridden by subclasses of base
server classes like :class:`TCPServer`; these methods aren't useful to external
users of the server object.
def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
- print "%s wrote:" % self.client_address[0]
+ print "{} wrote:".format(self.client_address[0])
print self.data
# just send back the same data, but upper-cased
self.request.send(self.data.upper())
# self.rfile is a file-like object created by the handler;
# we can now use e.g. readline() instead of raw recv() calls
self.data = self.rfile.readline().strip()
- print "%s wrote:" % self.client_address[0]
+ print "{} wrote:".format(self.client_address[0])
print self.data
# Likewise, self.wfile is a file-like object used to write back
# to the client
# Create a socket (SOCK_STREAM means a TCP socket)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- # Connect to server and send data
- sock.connect((HOST, PORT))
- sock.send(data + "\n")
+ try:
+ # Connect to server and send data
+ sock.connect((HOST, PORT))
+ sock.send(data + "\n")
- # Receive data from the server and shut down
- received = sock.recv(1024)
- sock.close()
+ # Receive data from the server and shut down
+ received = sock.recv(1024)
+ finally:
+ sock.close()
- print "Sent: %s" % data
- print "Received: %s" % received
+ print "Sent: {}".format(data)
+ print "Received: {}".format(received)
The output of the example should look something like this:
def handle(self):
data = self.request[0].strip()
socket = self.request[1]
- print "%s wrote:" % self.client_address[0]
+ print "{} wrote:".format(self.client_address[0])
print data
socket.sendto(data.upper(), self.client_address)
sock.sendto(data + "\n", (HOST, PORT))
received = sock.recv(1024)
- print "Sent: %s" % data
- print "Received: %s" % received
+ print "Sent: {}".format(data)
+ print "Received: {}".format(received)
The output of the example should look exactly like for the TCP server example.
def handle(self):
data = self.request.recv(1024)
- cur_thread = threading.currentThread()
- response = "%s: %s" % (cur_thread.getName(), data)
+ cur_thread = threading.current_thread()
+ response = "{}: {}".format(cur_thread.name, data)
self.request.send(response)
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
def client(ip, port, message):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
- sock.send(message)
- response = sock.recv(1024)
- print "Received: %s" % response
- sock.close()
+ try:
+ sock.send(message)
+ response = sock.recv(1024)
+ print "Received: {}".format(response)
+ finally:
+ sock.close()
if __name__ == "__main__":
# Port 0 means to select an arbitrary unused port
# more thread for each request
server_thread = threading.Thread(target=server.serve_forever)
# Exit the server thread when the main thread terminates
- server_thread.setDaemon(True)
+ server_thread.daemon = True
server_thread.start()
- print "Server loop running in thread:", server_thread.getName()
+ print "Server loop running in thread:", server_thread.name
client(ip, port, "Hello World 1")
client(ip, port, "Hello World 2")
server.shutdown()
+
The output of the example should look something like this::
$ python ThreadedTCPServer.py