Pythonのsocketモジュール
PythonのsocketはBSDを元にしたOSのソケットインターフェースへのアクセスを提供するモジュールになります。OSのソケットAPIを呼び出すライブラリです。
そもそもソケットとはサーバとクライアントを結ぶ仮想的な接続となり、TCP/IPをプログラムから利用するための接続口となります。
基本的なサーバ、クライアントのソケット通信の処理は以下となります。
サーバ
・ソケットの作成
・bindで通信のアドレスとポート番号を指定
・listenでクライアントの接続を待つ
・acceptでクライアントの接続を受け付ける
・sendやrecvを使ってクライアントのデータの送受信を行う
・closeでソケットを閉じる
クライアント
・ソケットの作成
・bindで通信のアドレスとポート番号を指定
・connectでリモートソケットに接続
・closeでソケットを閉じる
Pythonでのサーバ側の実装は以下のようになります。
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(("localhost", 8080))
serversocket.listen(1)
(clientsocket, address) = serversocket.accept()
msg = clientsocket.recv(4096)
clientsocket.send(b"Hello, client")
clientsocket.close()
ここでsocket.socketのAF_INETとSOCK_STREAMは
アドレスファミリ、ソケットタイプを指定しています。
アドレスファミリはUnixドメインソケット、IPv4、IPv6などの指定を行いAF_INETはIPv4となります。(Unixドメインソケットはローカルなプロセス間通信を行うものです。)
ソケットタイプはTCP、UDPなどの種類があります。
SOCK_STREAMはTCP、SOCK_DGRAMはUDPとなります。
実際の処理は
socket.socketでソケットを作成し、socket.bindはソケットをアドレスにバインドします。
socket.listenはサーバを有効にしていくつの接続を受け付けるか設定します。socket.acceptはアドレスにバインド済みでlisten中のソケットに対して戻り値として新しいソケットオブジェクトを返します。
socket.recvはソケットからデータを受信し、結果をbytesオブジェクトで返し一度に受信するデータは引数に渡したバッファサイズとなります。
socket.sendはソケットにデータを送信します。同じような送信の関数にsocket.sendallというものがあり、こちらはbytesの全データを送信するか、エラーが発生するまで処理を継続します。
クライアントに関しては以下となります。
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.connect(("localhost", 8080))
serversocket.send(b"Hello, server.")
msg = serversocket.recv(1024)
serversocket.close()
サーバ側との違いはconnectだけとなり、これはアドレスで指定されたリモートソケットに接続します。
この記事が気に入ったらサポートをしてみませんか?