Pythonネットワークプログラミング:ソケットと高度なプロトコルをマスター
ソケットとは
ソケットは双方向通信チャネルのエンドポイントです。ソケットはプロセス内、同一マシン上のプロセス間、異なる大陸のプロセス間で通信できます。
ソケットは、Unixドメインソケット、TCP、UDPなど、さまざまなチャネルタイプで実装できます。socketライブラリは、一般的なトランスポートを処理するための特定のクラスと、残りを処理するための汎用インターフェースを提供します。
ソケットには独自の用語があります:
| No. | 用語と説明 |
|---|---|
| 1 | ドメイン - トランスポートメカニズムとして使用されるプロトコルファミリ。AF_INET、PF_INET、PF_UNIX、PF_X25などの定数 |
| 2 | タイプ - 2つのエンドポイント間の通信タイプ。通常、接続指向プロトコルにはSOCK_STREAM、非接続型プロトコルにはSOCK_DGRAM |
| 3 | プロトコル - 通常はゼロ。ドメインとタイプ内でプロトコルのバリアントを識別するために使用される場合がある |
| 4 | ホスト名 - ネットワークインターフェースの識別子
|
| 5 | ポート - 各サーバーは1つ以上のポートでクライアントからの呼び出しを待機。ポートはFixnumポート番号、ポート番号を含む文字列、またはサービス名 |
socketモジュール
ソケットを作成するには、socketモジュールで利用可能なsocket.socket()関数を使用します。一般的な構文:
s = socket.socket(socket_family, socket_type, protocol=0)
パラメータ
- socket_family - AF_UNIXまたはAF_INET(前述)
- socket_type - SOCK_STREAMまたはSOCK_DGRAM
- protocol - 通常は省略、デフォルトは0
socketオブジェクトを取得したら、必要な関数を使用してクライアントまたはサーバープログラムを作成できます。必要な関数のリスト:
サーバーソケットメソッド
| No. | メソッドと説明 |
|---|---|
| 1 | s.bind() - アドレス(ホスト名、ポート番号の組み合わせ)をソケットにバインド |
| 2 | s.listen() - TCPリスナーをセットアップして開始 |
| 3 | s.accept() - TCPクライアント接続を受動的に受け入れ、接続が到着するまで待機(ブロッキング) |
クライアントソケットメソッド
| No. | メソッドと説明 |
|---|---|
| 1 | s.connect() - TCPサーバー接続を能動的に開始 |
汎用ソケットメソッド
| No. | メソッドと説明 |
|---|---|
| 1 | s.recv() - TCPメッセージを受信 |
| 2 | s.send() - TCPメッセージを送信 |
| 3 | s.recvfrom() - UDPメッセージを受信 |
| 4 | s.sendto() - UDPメッセージを送信 |
| 5 | s.close() - ソケットを閉じる |
| 6 | socket.gethostname() - ホスト名を返す |
シンプルなサーバー
インターネットサーバーを書くには、socketモジュールで利用可能なsocket関数を使用してソケットオブジェクトを作成します。ソケットオブジェクトを使用して他の関数を呼び出し、ソケットサーバーをセットアップします。
次に、bind(hostname, port)関数を呼び出して、指定されたホスト上のサービス用portを指定します。
次に、返されたオブジェクトのacceptメソッドを呼び出します。このメソッドは、指定したポートにクライアントが接続するまで待機し、そのクライアントへの接続を表すconnectionオブジェクトを返します。
#!/usr/bin/python
# サーバーファイル: server.py
import socket # socketモジュールをインポート
s = socket.socket() # ソケットオブジェクトを作成
host = socket.gethostname() # ローカルマシン名を取得
port = 12345 # サービス用ポートを予約
s.bind((host, port)) # ポートにバインド
s.listen(5) # クライアント接続を待機
while True:
c, addr = s.accept() # クライアントとの接続を確立
print('Got connection from', addr)
c.send('Thank you for connecting')
c.close() # 接続を閉じる
シンプルなクライアント
指定されたポート12345とホストへの接続を開く非常にシンプルなクライアントプログラムを書きます。Pythonのsocketモジュール関数を使用してソケットクライアントを作成するのは非常に簡単です。
socket.connect(hostname, port)は、hostnameのportへのTCP接続を開きます。ソケットが開いたら、ファイルと同様にそこから読み取りできます。完了したら、ファイルを閉じるように閉じることを忘れないでください。
以下のコードは、指定されたホストとポートに接続し、ソケットから利用可能なデータを読み取り、終了する非常にシンプルなクライアントです。
#!/usr/bin/python
# クライアントファイル: client.py
import socket # socketモジュールをインポート
s = socket.socket() # ソケットオブジェクトを作成
host = socket.gethostname() # ローカルマシン名を取得
port = 12345 # サービス用ポートを予約
s.connect((host, port))
print(s.recv(1024))
s.close() # 完了したらソケットを閉じる
このserver.pyをバックグラウンドで実行し、上記のclient.pyを実行して結果を見てみます。
# 以下でサーバーをバックグラウンドで起動
$ python server.py &
# サーバーが起動したらクライアントを実行
$ python client.py
以下の結果が出力されます:
Got connection from ('127.0.0.1', 48437)
Thank you for connecting
Pythonインターネットモジュール
Pythonネットワーク/インターネットプログラミングにおける重要なモジュールの一覧:
| プロトコル | 一般的な機能 | ポート番号 | Pythonモジュール |
|---|---|---|---|
| HTTP | Webページ | 80 | httplib, urllib, xmlrpclib |
| NNTP | Usenetニュース | 119 | nntplib |
| FTP | ファイル転送 | 20 | ftplib, urllib |
| SMTP | メール送信 | 25 | smtplib |
| POP3 | メール受信 | 110 | poplib |
| IMAP4 | メール受信 | 143 | imaplib |
| Telnet | コマンドライン | 23 | telnetlib |
| Gopher | ドキュメント転送 | 70 | gopherlib, urllib |
FTP、SMTP、POP、IMAPプロトコルで作業するために、上記で言及されたすべてのライブラリを確認してください。
さらに学ぶために
これはソケットプログラミングのクイックスタートでした。広大なテーマです。詳細は以下のリンクを参照することをお勧めします。
- Unix Socket Programming
- Python Socket Library and Modules
Python
- Python データ型マスター: 実践ガイド
- Python 演算子完全マスター: 包括的ガイド
- Python pass文完全マスター: 実践ガイド
- Python 関数引数完全マスター: 位置引数・キーワード引数・デフォルト引数
- Python辞書完全ガイド:作成、操作、高度なテクニック
- Pythonオブジェクト指向プログラミング完全ガイド:クラス、継承、カプセル化、ポリモーフィズム
- Pythonイテレータ完全ガイド:仕組みと自作方法
- Pythonクロージャ解説:ネスト関数が変数を捕捉する仕組み
- Python datetimeマスター:日付・時刻・タイムゾーン実践ガイド
- Pythonのtime.sleep()をマスター:ベストプラクティス、マルチスレッド、実例
- Pythonマルチスレッドプログラミング:効率的な並行処理テクニック