前回のコンピュータ一台でソケット通信を試すの続き。
前回は一台のコンピュータのローカルホスト(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でソケット通信を試してみたい。