class MyTCPHandler(SocketServer.BaseRequestHandler): """ The RequestHandler class for our server. It is instantiated once per connection to the server, and must override the handle() method to implement communication to the client. """
def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() print "{} wrote:".format(self.client_address[0]) print self.data # just send back the same data, but upper-cased self.request.sendall(self.data.upper())
if __name__ == "__main__": HOST, PORT = "localhost", 21577 # Create the server, binding to localhost on port 21577 SocketServer.TCPServer.allow_reuse_address = True server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) print " .... waiting for connection"
# Activate the server; this will keep running until you # interrupt the program with Ctrl-C server.serve_forever()
while True: tcpCliSock=socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR) data=raw_input('>') if not data: break tcpCliSock.send('%s\r\n' % data) data=tcpCliSock.recv(BUFSIZE) if not data: break print data.strip() tcpCliSock.close()
运行示例: Server $ python TCPServer.py 127.0.0.1 wrote: hello world with TCP 127.0.0.1 wrote: python is nice
CLIENT: $ python TCPClient.py hello world with TCP Sent: hello world with TCP Received: HELLO WORLD WITH TCP $ python TCPClient.py python is nice Sent: python is nice Received: PYTHON IS NICE
2. UDP通信
SERVER端 import SocketServer
class MyUDPHandler(SocketServer.BaseRequestHandler): """ This class works similar to the TCP handler class, except that self.request consists of a pair of data and client socket, and since there is no connection the client address must be given explicitly when sending data back via sendto(). """
def handle(self): data = self.request[0].strip() socket = self.request[1] print "{} wrote:".format(self.client_address[0]) print data socket.sendto(data.upper(), self.client_address)
if __name__ == "__main__": HOST, PORT = "localhost", 9999 server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler) server.serve_forever()
CLIENT端: import socket import sys
HOST, PORT = "localhost", 9999 data = " ".join(sys.argv[1:])
# SOCK_DGRAM is the socket type to use for UDP sockets sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 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(data + "\n", (HOST, PORT)) received = sock.recv(1024)
if __name__ == "__main__": # Port 0 means to select an arbitrary unused port HOST, PORT = "localhost", 0
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler) ip, port = server.server_address
# Start a thread with the server -- that thread will then start one # more thread for each request server_thread = threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates server_thread.daemon = True server_thread.start() print "Server loop running in thread:", server_thread.name
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: Thread-2: Hello World 1 Received: Thread-3: Hello World 2 Received: Thread-4: Hello World 3