この記事では主に Python ソケットプログラミングの詳細を紹介します。ソケットは接続を確立してデータを転送できます。興味のある方は参考にしてください。
ソケットプログラミングにPythonを使う場合、データストリームをブロッキング(デフォルト)メソッドで読み込む必要があるため、データの末尾を毎回自分で処理する必要があり、非常に面倒です。インターネット上で適切なパッケージが見つからなかったので、自分で簡単なパッケージを作成しました。
カプセル化のアイデア
1. クライアントは、特定のデータをカプセル化する SocketRequest オブジェクトを送信します。送信するデータには、終了文字識別子(EOF = ‘0x00’)が自動的に付加されます。
2. サーバーはデータを受信すると、終了文字識別子に基づいて完全なデータを生成し、それを SocketRequest オブジェクトに解凍します。
3. サーバーは SocketRequest の内容に基づいて SocketResponse オブジェクトを生成します。この例では、処理は行われず、オブジェクトがそのまま返されます。
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)
Test
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 中国語 Web サイトの他の関連記事を参照してください。