Pythonでソケットを使ったP2P通信の基本をマスターする

この記事では、Pythonでソケットを使ったP2P(Peer-to-Peer)通信の基本について解説します。Pythonのソケットプログラミングにおける基本的な知識から、簡単なサンプルコード、応用例まで詳しく見ていきます。

目次

ソケットとは

ソケット(Socket)は、ネットワークを通じてデータを送受信するためのエンドポイント(接続点)です。一般的には、IPアドレスとポート番号の組み合わせによって識別されます。

P2P通信とは

P2P(Peer-to-Peer)通信とは、中央サーバーを介さずにネットワーク上の各端末(ピア)が直接データを送受信する形式の通信です。この方法は、中央サーバーに依存しないため、柔軟性があります。

Pythonでのソケットプログラミングの基本

Pythonでソケットプログラミングを行うには、主に`socket`モジュールを使用します。

簡単なサンプルコード

# サーバー側
import socket

# IPアドレスとポート番号を設定
HOST = '127.0.0.1'
PORT = 65432

# ソケットオブジェクトを作成
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('接続されました:', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)
# クライアント側
import socket

HOST = '127.0.0.1'
PORT = 65432

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)

print('Received', repr(data))

コード解説

– `socket.AF_INET`: IPv4を指定しています。
– `socket.SOCK_STREAM`: TCPプロトコルを用いるための設定です。
– `s.bind()`: ソケットにIPとポートをバインドします。
– `s.listen()`: クライアントからの接続を待ちます。
– `s.accept()`: 接続を受け入れます。

応用例1: ファイルの送受信

ソケット通信を利用して、簡単なファイルの送受信プログラムを作成してみましょう。

# サーバー側
import socket

HOST = '127.0.0.1'
PORT = 65432

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('接続されました:', addr)
        with open('received_file.txt', 'wb') as f:
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                f.write(data)

応用例2: チャットアプリケーション

簡易的なチャットアプリケーションをソケットで作成してみましょう。

# サーバー側
import socket

HOST = '127.0.0.1'
PORT = 65432

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('接続されました:', addr)
        while True:
            data = conn.recv(1024).decode('utf-8')
            if data == 'exit':
                break
            print('Received:', data)
            msg = input('Your message: ')
            conn.sendall(msg.encode('utf-8'))

応用例の解説

– `wb`はバイナリ書き込みモードで、受け取ったデータをそのままファイルに書き込むために使用します。
– `decode`と`encode`は文字列をUTF-8形式でエンコード、デコードするために使用します。

まとめ

Pythonでのソケットプログラミングは多くの応用可能性を持っています。この記事で紹介した基本的な知識と応用例を活かして、さまざまな通信プログラムを作成してみてください。

コメント

コメントする

目次