マシン間でデータをやり取りしたくなることありますよね?
ということで初めてsocket使ってみました。
(といいつつ今回のサンプルはlocalhostです)
ソケットそのものについては省略。
使うもの
socket
モジュールを使用する。それだけ。標準ライブラリなのも良い。
予めサーバー側で準備しておいた後、クライアントとサーバーのやり取りは以下のようにされる。
サーバー側での接続前準備(socket, bind, listen) + 接続
server.py
import socket
# サーバーのIPアドレスとポート番号
host = 'localhost'
port = 12345
# socketオブジェクトの作成
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# IPアドレスとポートをソケットにバインド
server_socket.bind((host, port))
# クライアントからの接続を待ち受ける
server_socket.listen()
print(f"Listening on {host}:{port}...")
# 接続の受け入れ
client_socket, addr = server_socket.accept()
print(f"Connected by {addr}")
# クライアントからのデータを受信
data = client_socket.recv(1024)
print(f"Received: {data.decode()}")
# クライアントへデータを送信
client_socket.sendall(b'Hello from server!')
# 接続のクローズ
client_socket.close()
server_socket.close()
クライアント側による接続
client.py
import socket
# サーバーのIPアドレスとポート番号
host = 'localhost'
port = 12345
# socketオブジェクトの作成
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# サーバーに接続
client_socket.connect((host, port))
# サーバーへデータを送信
client_socket.sendall(b'Hello from client!')
# サーバーからのデータを受信
data = client_socket.recv(1024)
print(f"Received: {data.decode()}")
# 接続のクローズ
client_socket.close()
動作
- terminalを2つ立ち上げる
- 1つ目のterminalで
python server.py
を起動する - 2つ目のterminalで
python client.py
を起動する
今回の場合、結果は以下のように出力される。
server output
Listening on localhost:12345...
Connected by ('127.0.0.1', 64120)
Received: Hello from client!
client output
Received: Hello from server!
無事にclient側でサーバーからのデータを受信できていることが確認された!
Option(超ざっくり)
アドレスファミリー
アドレスファミリー | 説明 | 指定するアドレス |
---|---|---|
AF_UNIX | ローカル通信用 | ソケットファイルのパス |
AF_INET | IPv4 | ホスト名、ポート番号 |
AF_INET6 | IPv6 | ホスト名、ポート番号 |
ソケットタイプ
アドレスファミリー | 説明 |
---|---|
SOCK_STREAM | TCP |
SOCKDGRAM | UDP |
参考記事
書いた後にすごくまとまった素晴らしい記事を見つけました。
南無。。。