python网络编程之TCP通信实例和socketserver框架使用例子
1.TCP是一种面向连接的可靠地协议,在一方发送数据之前,必须在双方之间建立一个连接,建立的过程需要经过三次握手,通信完成后要拆除连接,需要经过四次握手,这是由TCP的半关闭造成的,一方在完成数据发送后要发送一个FIN来终止这个方向的连接,一个TCP连接在收到一个FIN后仍能发送数据,但应用程序很少这么做,下面是TCP连接建立和拆除的过程: 2.python可以实现TCP服务器和客户端的编程,下面是代码: 服务器端: 复制代码 代码如下: #!/usr/bin/env python import socket host="localhost" port=10000 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((host,port)) s.listen(5) while 1: sock,addr=s.accept() print "got connection form ",sock.getpeername() data=sock.recv(1024) if not data: break else: print data 客户端: 复制代码 代码如下: #!/usr/bin/env python import socket host="localhost" port=10000 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((host,port)) s.send("hello from client") s.close() 3.使用socketserver框架编写TCP服务器 Socketserver模块可以简化网络服务器的编写,它包含了四种服务器类,TCPServer使用TCP协议,UDPServer使用UDP协议,还有两个不常使用的,即UnixStreamServer和UnixDatagramServer,这两个类仅仅在unix环境下有用。 使用服务器编程,需要进行一下步骤,先建立一个请求句柄类,这个类继承自BaseRequestHandler类,建立这个类后重写它的handle方法,然后实例化服务器类,把主机名,端口号和句柄类传给它,然后调用server_forever()方法来处理请求。 使用socketserver框架的服务器: 复制代码 代码如下: import SocketServer host='' port=10000 class Handler(SocketServer.StreamRequestHandler): def handler(self): addr=self.request.getpeername() print "got connection from",addr self.wfile.write("connected") server=SocketServer.TCPServer((host,port),Handler) server.serve_forever() 上面的socketserver服务器只能处理一个请求,如果要处理多个请求,可以用forking或者threading实现,实现多进程或者多线程服务器。下面是使用forking和threading的服务器代码: 使用forking的服务器: 复制代码 代码如下: from SocketServer import TCPServer,ForkingMixIn,StreamRequestHandler class Server(ForkingMixIn,TCPServer):pass class Handler(StreamRequestHandler): def handle(self): addr=self.request.getpeername() print "got connection from",addr self.wfile.write('connected') server=Server((''.10000),Handler) server.serve_forever() 使用多线程的服务器: 复制代码 代码如下: from SocketServer import TCPServer,ThreadingMixIn,StreamRequestHandler class Server(ThreadingMixIn,TCPServer):pass class Handler(StreamRequestHandler): (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |