0
0

マシン間でデータをやり取りしたくなることありますよね?
ということで初めて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()

動作

  1. terminalを2つ立ち上げる
  2. 1つ目のterminalでpython server.pyを起動する
  3. 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

参考記事

書いた後にすごくまとまった素晴らしい記事を見つけました。
南無。。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0