SocketServer与客户端进行连接的示意图:
只要客户端连接进来,我们就为客户端创建1个线程或进程,创建完成之后,客户端直接和创建的线程直接进行通信(即3和4步),因此这样的话可以通过这个模块传输大的文件。
1.基于线程版本的SocketServer示例
server.py
#!/usr/bin/env python # -*- coding:utf-8 -*- import SocketServer class MyServer(SocketServer.BaseRequestHandler): #重写handle方法 def handle(self): # print self.request,self.client_address,self.server conn = self.request conn.sendall('welcome to call 10086,plz input 1,0 connect man servervice.') Flag = True while Flag: data = conn.recv(1024) if data == 'exit': Flag = False elif data == '0': conn.sendall('you have being getting man service....') else: conn.sendall('plz input again.') if __name__ == '__main__': #创建SocketServer线程对象 server = SocketServer.ThreadingTCPServer(('127.0.0.1',8009),MyServer) #执行server对象的serve_forever方法 server.serve_forever()
client.py
#!/usr/bin/env python # -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',8009) sk = socket.socket() sk.connect(ip_port) sk.settimeout(5) while True: data = sk.recv(1024) print 'receive:',data inp = raw_input('please input:') sk.sendall(inp) if inp == 'exit': break sk.close()
2.基于进程版本的SocketServer的示例(将上述服务器端中的ThreadingTCPServer换成ForkingTCPServer即可)
server.py
#!/usr/bin/env python # -*- coding:utf-8 -*- import SocketServer class MyServer(SocketServer.BaseRequestHandler): #重写handle方法 def handle(self): # print self.request,self.client_address,self.server conn = self.request conn.sendall('welcome to call 10086,plz input 1,0 connect man servervice.') Flag = True while Flag: data = conn.recv(1024) if data == 'exit': Flag = False elif data == '0': conn.sendall('you have being getting man service....') else: conn.sendall('plz input again.') if __name__ == '__main__': #创建SocketServer线程对象 server = SocketServer.ForkingTCPServer(('127.0.0.1',8009),MyServer) #执行server对象的serve_forever方法 server.serve_forever()
client.py
#!/usr/bin/env python # -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',8009) sk = socket.socket() sk.connect(ip_port) sk.settimeout(5) while True: data = sk.recv(1024) print 'receive:',data inp = raw_input('please input:') sk.sendall(inp) if inp == 'exit': break sk.close()