ホームページ >バックエンド開発 >Python チュートリアル >Python Socketを使ったプログラミングを詳しく解説

Python Socketを使ったプログラミングを詳しく解説

高洛峰
高洛峰オリジナル
2017-03-24 16:12:391116ブラウズ

この記事では主に 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。