
前回のコンピュータ一台でソケット通信を試すの続き。
前回は一台のコンピュータのローカルホスト(127.0.0.1)内で、サーバとクライアントのプロセスを立ち上げてソケット通信を行った。
実際にやりたいことは、どこかしらに設置したマイコンが温度を取得して、それを遠方のコンピュータに送信することなので、今回は少しだけ距離を離し、二台のコンピュータでローカルネットワーク内でソケット通信を行ってみる。
サーバ側のコンピュータとして、Raspberry Pi 4B 8G(OS:Raspberry Pi OS)を用意し、クライアント側のコンピュータとして、Linux(OS:Ubuntu20.04)を用意した。

プログラミング教育で注目すべきはARM + Debian + Pythonであるはずだ
はじめにサーバ側であるRaspberry Piの方のローカルネットワークで割り当てられたIPアドレス(ローカルIP)を調べる。
$ ip addr
ipコマンドによって、ローカルIPは192.168.0.14であることがわかった。
このIPアドレスを元に前回作成したsrv.pyを書き換える。
/path/to/dir/srv.py
import socket
PORT = 12345
BUF_SIZE = 1024
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.bind(('192.168.0.14', PORT))
sock.listen()
print("Waiting for connection.")
while True:
(conn, cli) = sock.accept()
try:
print('Client connected', cli)
data = conn.recv(BUF_SIZE)
print('Received:' + data.decode())
mes = 'Successed!'
conn.send(mes.encode())
finally:
conn.close()
端末を開き、下記のコードでサーバを立ち上げておく。
$ python3 /path/to/dir/srv.py Waiting for connection.
続いて、クライアント側のLinux機のコードを作成する。
/path/to/dir/cli.py
import socket
PORT = 12345
BUF_SIZE = 1024
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
# srv.pyで指定したIPアドレスに合わせる
sock.connect(('192.168.0.14', PORT))
data = input('input:')
sock.send(data.encode())
print(sock.recv(BUF_SIZE).decode())
cli.pyの実行前にクライアント側のLinux機に割り当てられたローカルIPを調べておく。
$ ip addr
ローカルIPは192.168.0.27であった。
双方のローカルIPもわかった事だし、cli.pyを実行してみると、
$ python3 /path/to/dir/cli.py input:
サーバ側のRaspberry Piの方の端末を見てみると、
$ python3 /path/to/dir/srv.py
Waiting for connection.
Client connected ('192.168.0.27', 36732)
Linuxの方のローカルIPが出力されたので、二台でソケット通信はうまくいったようだ。
cli.py側で送信等は省略する。
次はNodeMCU(ESP8266)とRaspberry PIでソケット通信を試してみたい。





