1. 程式人生 > >Python多執行緒Socket程式例子

Python多執行緒Socket程式例子

如果沒有multitask包,請從http://python-multitask.googlecode.com/files/multitask-0.2.0.zip
server端
Python程式碼 
  1. from __future__ import with_statement  
  2. from contextlib import closing  
  3. import socket  
  4. import multitask  
  5. def client_handler(sock):  
  6.     with closing(sock):  
  7.         while True:  
  8.             data = (yield
     multitask.recv(sock, 1024))  
  9.             if not data:  
  10.                 break  
  11.             yield multitask.send(sock, data)  
  12. def echo_server(hostname, port):  
  13.     addrinfo = socket.getaddrinfo(hostname, port,  
  14.                                   socket.AF_INET,  
  15.                                   socket.SOCK_STREAM)  
  16.     (family, socketype, porot, canonname, sockaddr) = addrinfo[0]  
  17.     with closing(socket.socket(family,  
  18.                                socketype,  
  19.                                porot)) as sock:  
  20.         sock.setsockopt(socket.SOL_SOCKET,  
  21.                         socket.SO_REUSEADDR, 1)  
  22.         sock.bind(sockaddr)  
  23.         sock.listen(5)  
  24.         while True:  
  25.             multitask.add(client_handler((  
  26.                         yield multitask.accept(sock))[0]))  
  27. if __name__ == '__main__':  
  28.     import sys  
  29.     hostname = '192.168.2.102'  
  30.     port = 1111  
  31.     if len(sys.argv) > 1:  
  32.         hostname = sys.argv[1]  
  33.     if len(sys.argv) > 2:  
  34.         port = int(sys.argv[2])  
  35.     multitask.add(echo_server(hostname, port))  
  36.     try:  
  37.         multitask.run()  
  38.     except KeyboardInterrupt:  
  39.         pass  


client端測試

Python程式碼 
  1. import socket  
  2. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  3. sock.connect(('192.168.2.102'1111))  
  4. sock.send('hello')  
  5. data = sock.recv(1024)  
  6. sock.close()  
  7. print 'Received', repr(data)