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(bytes(data + "\n","utf8"))
+ try:
+ # Connect to server and send data
+ sock.connect((HOST, PORT))
+ sock.send(bytes(data + "\n", "utf-8"))
- # Receive data from the server and shut down
- received = sock.recv(1024)
- sock.close()
+ # Receive data from the server and shut down
+ received = str(sock.recv(1024), "utf-8")
+ 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:
$ python TCPClient.py hello world with TCP
Sent: hello world with TCP
- Received: b'HELLO WORLD WITH TCP'
+ Received: HELLO WORLD WITH TCP
$ python TCPClient.py python is nice
Sent: python is nice
- Received: b'PYTHON IS NICE'
+ Received: PYTHON IS NICE
:class:`socketserver.UDPServer` Example
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)
# As you can see, there is no connect() call; UDP has no connections.
# Instead, data is directly sent to the recipient via sendto().
- sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT))
- received = sock.recv(1024)
+ sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT))
+ received = str(sock.recv(1024), "utf-8")
- 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.
class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
def handle(self):
- data = self.request.recv(1024)
+ data = str(self.request.recv(1024), 'ascii')
cur_thread = threading.current_thread()
- response = bytes("%s: %s" % (cur_thread.getName(), data),'ascii')
+ response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
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(bytes(message, 'ascii'))
+ response = str(sock.recv(1024), 'ascii')
+ 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.name)
- client(ip, port, b"Hello World 1")
- client(ip, port, b"Hello World 2")
- client(ip, port, b"Hello World 3")
+ client(ip, port, "Hello World 1")
+ client(ip, port, "Hello World 2")
+ client(ip, port, "Hello World 3")
server.shutdown()
$ python ThreadedTCPServer.py
Server loop running in thread: Thread-1
- Received: b"Thread-2: b'Hello World 1'"
- Received: b"Thread-3: b'Hello World 2'"
- Received: b"Thread-4: b'Hello World 3'"
+ Received: Thread-2: Hello World 1
+ Received: Thread-3: Hello World 2
+ Received: Thread-4: Hello World 3
The :class:`ForkingMixIn` class is used in the same way, except that the server