前回のコンピュータ一台でソケット通信を試すの続き。

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