這篇文章主要介紹了Python Socket程式設計詳細介紹,socket可以建立連接,傳遞數據,具有一定的參考價值,有興趣的小夥伴們可以參考一下。
在使用Python做socket程式設計時,由於需要使用阻塞(預設)的方式來讀取資料流,此時對於資料的結束每次都需要自己處理,太麻煩。而且網路上也沒找到太好的封裝,所以就自己寫了個簡單的封裝。
封裝思路
1. 客戶端每次請求均發送 SocketRequest 對象,其中封裝具體的數據,這裡使用json。對於要傳送的數據,會自動新增一個結束符標識(EOF = ‘0x00')。
2. 伺服器端接收資料時,根據結束符標識來產生完整的數據,並解包成 SocketRequest 物件。
3. 伺服器端根據 SocketRequest 的內容,來產生 SocketResponse 對象,這裡使用了一個 SimpleRequestHandler 類別來處理,範例中就是沒有做任何處理,然後原樣返回。
4. 伺服器端傳送 SocketResponse 給客戶端。其中也需要對包做一個封裝,會自動加入一個結束符號標識(EOF = ‘0x00')。
5. 客戶接收資料時,根據結束符標識來產生完整的數據,並解包成 SocketResponse 對象,然後返回。
封裝類別
sockets.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import socket import pickle import thread PORT = 12345 EOF = '0x00' class SocketServer(object): def __init__(self, port=None): self.port = port def startup(self): sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock_server.bind(('0.0.0.0', self.port)) sock_server.listen(0) while True: sock, address = sock_server.accept() thread.start_new_thread(self.__invoke, (sock, address)) def shutdown(self): pass def __invoke(self, sock, address): try: full_data = '' while True: data = sock.recv(1024) if data is None: return full_data += data if full_data.endswith(EOF): full_data = full_data[0:len(full_data) - len(EOF)] request = pickle.loads(full_data) response = SimpleRequestHandler().handle(request) sock.sendall(pickle.dumps(response) + EOF) return except Exception as e: print e finally: sock.close() class SocketClient(object): def __init__(self, host, port): self.host = host self.port = port def execute(self, request): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((self.host, self.port)) try: sock.sendall(pickle.dumps(request) + EOF) full_data = '' while True: data = sock.recv(1024) if data: full_data += data if full_data.endswith(EOF): full_data = full_data[0:len(full_data) - len(EOF)] response = pickle.loads(full_data) return response else: return None except Exception as e: print e return None finally: sock.close() class SocketRequest(object): def __init__(self, data): self.data = data def __repr__(self): return repr(self.__dict__) class SocketResponse(object): def __init__(self, data): self.data = data def __repr__(self): return repr(self.__dict__) class SimpleRequestHandler(object): def __init__(self): pass def __repr__(self): return repr(self.__dict__) def handle(self, request): return SocketResponse(request.data)
測試
socket_server.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from agent.sockets import * ss = SocketServer(PORT) ss.startup()
socket_client.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import pickle from agent.sockets import * sc = SocketClient('localhost', PORT) request = SocketRequest('abc') response = sc.execute(request) print request print response
執行測試
首先,執行socket_server.py
然後,執行socket_client.py
以上是使用Python Socket編程詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!