Python 系列(18) socket 多处理

Posted on Posted in python

参考[Python Socket 多处理](http://liuhonghe.me/python-socket-muilt.html)

## socket 多处理介绍

  1. #coding:utf-8  
  2.   
  3. #写出一个功能  
  4. class socketHandler(SocketServer.BaseRequestHandler):  
  5.     def setup():  
  6.         #类似于构造函数,在handler类被实例化的时候自动执行  
  7.     def handle():  
  8.         #实现socket的核心,self.request 具体实现socket功能的  是父类自动创建出来的    
  9.         #self.request = socket.socket()  
  10.     def finish():  
  11.         #析构函数,在服务器结束的时候自动执行  
  12.   
  13.     #Handler类实现socket功能的句柄类       
  14.         #STREAMRequestHandler  TCP协议的Handler类的父类  
  15.         #DGRAMTequestHandler   UDP协议的Handler类的父类  
  16.         #BaseRequestHandler    所有handler类的父类  
  17.     #这三个类全部包含setup  handler   finish这三个方法,这三个方法不需要调用  
  18.   
  19. #再写一个服务  
  20. class socketserver(SocketServer.TCPServer):  
  21.     pass  
  22.   
  23. s = socketserver(("",8000),socketHandler)  #自动执行setup方法  
  24.   
  25. #第一个类是TCP服务器的基类 + 第二个是混合多线程的类 = 拥有多线程能力的TCP服务器  
  26. class MyServer(SocketServer.TCPServer,SocketServer.ThreadingMixIn):  
  27.     pass  

> 例子一,多个客户端连接 socket

  1. # server 端  
  2. import SocketServer  
  3.   
  4. class MyServer(SocketServer.BaseRequestHandler):  
  5.     def handle(self):  
  6.         conn = self.request  
  7.         conn.sendall('This is my threading')  
  8.         while 1:  
  9.             data = conn.recv(4096)  
  10.             if data == 'exit':  
  11.                 break  
  12.             elif data == '0':  
  13.                 conn.sendall('your input is 0')  
  14.             else:  
  15.                 conn.sendall('again')  
  16.             print ('{} : {} is send {}'.format(self.client_address[0],self.client_address[1],data))  
  17.   
  18. if __name__ == '__main__':  
  19.     server = SocketServer.ThreadingTCPServer(('',8000),MyServer)  
  20.     server.serve_forever()  
  21.   
  22. # 客户端  
  23.   
  24. ip_port = (('127.0.0.1',8000))  
  25. sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
  26. sk.connect(ip_port)  
  27. while 1:  
  28.     data = sk.recv(4096)  
  29.     print('接收:',data)  
  30.     inp = raw_input('please input:')  
  31.     sk.sendall(inp)  
  32.     if inp == 'exit':  
  33.         break  
  34. sk.close()  

> 例子二, socket连接后,传文件

  1. # server 端    
  2. #!/usr/bin/env python    
  3. # -*- coding: utf-8 -*-    
  4.     
  5. import SocketServer    
  6. import threading    
  7.     
  8. path = 'test.txt'    
  9. # 设置接收参数的 handle    
  10. class Myhandler(SocketServer.BaseRequestHandler):    
  11.     def setup(self): #类似构造函数,setup不接收参数    
  12.         self.file = open(path,'r')    
  13.         self.content = self.file.read()    
  14.     def handle(self):    
  15.         print('{} is connect'.format(self.client_address))    
  16.         request_data = self.request.recv(4096)    
  17.         print request_data    
  18.         self.request.sendall(self.content)    
  19.     def finish(self):    
  20.         print('{} is done'.format(self.client_address))    
  21.         if self.file.closed() == False:    
  22.             self.file.close()    
  23.     
  24. # 通过多继承形成新的支持多线程的服务器    
  25. class MyServer(SocketServer.TCPServer,SocketServer.ThreadingMixIn):   
  26.     allow_reuse_address = True # 端口重用   
  27.     pass    
  28.     
  29. # 实例化服务器,绑定地址和写好的 Handler 作为参数传入    
  30. m = MyServer(('',8000),Myhandler)    
  31. # 启动多线程    
  32. th = threading.Thread(target=m.serve_forever(),args=())    
  33. th.start()    
  34. th.shutdown()    
  35. th.server.close()    
  36.     
  37.     
  38. # 客户端    
  39.     
  40. import socket    
  41. sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)    
  42. sock.connect(('127.0.0.1',8000))    
  43. sock.send('hello I am your user')    
  44. with open('test.txt','w') as f:    
  45.     f.write(sock.recv(1024))    
  46. sock.close()    
» 转载请注明来源:若我若鱼 » Python 系列(18) socket 多处理

Leave a Reply

Your email address will not be published. Required fields are marked *

three × 1 =