這篇文章主要為大家詳細介紹了python多線程socket編程之多客戶端接入,具有一定的參考價值,感興趣的小伙伴們可以參考一下
Python中實現socket通信的服務端比較複雜,而客戶端非常簡單,所以客戶端基本上都是用sockct模組實現,而服務
端用有很多模組可以使用,如下:
1、客戶端
#!/usr/bin/env python #coding:utf-8 ''' file:client.py date:9/9/17 3:43 PM author:lockey email:lockey@123.com desc:socket编程客户端,python3.6.2 ''' import socket,sys HOST = '192.168.1.6' PORT = 8998 ADDR =(HOST,PORT) BUFSIZE = 1024 sock = socket.socket() try: sock.connect(ADDR) print('have connected with server') while True: data = input('lockey# ') if len(data)>0: print('send:',data) sock.sendall(data.encode('utf-8')) #不要用send() recv_data = sock.recv(BUFSIZE) print('receive:',recv_data.decode('utf-8')) else: sock.close() break except Exception: print('error') sock.close() sys.exit()
2、SocketServer模組
#為了能夠讓多個客戶端同時接入服務並進行通信,服務端將使用SocketServer模組來實現,這樣的話用戶不用在子線程結束後,利用父進程對它進行處理,也不用關心socket的關閉,一切都由SocketServer來完成。
#!/usr/bin/env python #coding:utf-8 ''' file:client.py date:9/9/17 3:43 PM author:lockey email:lockey@123.com desc:socket编程服务器端,python3.6.2 ''' from socketserver import BaseRequestHandler,ThreadingTCPServer import threading BUF_SIZE=1024 class Handler(BaseRequestHandler): def handle(self): address,pid = self.client_address print('%s connected!'%address) while True: data = self.request.recv(BUF_SIZE) if len(data)>0: print('receive=',data.decode('utf-8')) cur_thread = threading.current_thread() #response = '{}:{}'.format(cur_thread.ident,data) self.request.sendall('response'.encode('utf-8')) print('send:','response') else: print('close') break if __name__ == '__main__': HOST = '192.168.1.6' PORT = 8998 ADDR = (HOST,PORT) server = ThreadingTCPServer(ADDR,Handler) #参数为监听地址和已建立连接的处理类 print('listening') server.serve_forever() #监听,建立好TCP连接后,为该连接创建新的socket和线程,并由处理类中的handle方法处理 print(server)
以下測試中我使用另外一台主機和本機的兩個中斷去連接伺服器,都可以正常連接並且能進行資料應答交互
注意:此程式範例運行平台為rhel7.2.x86_64,python版本為3.6.2,對於windows平台和非同一python版本的使用者可能缺乏一定的兼容性,如果是其他平台用戶請自行修正! !
以上是python多執行緒socket程式設計中將多客戶端存取的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!