はじめに
ESP32のソケット通信の実装で個人的に理解に苦しんだ部分があったので,補足説明を.参考記事の方と一緒に読んでください.
参考記事:
ESP32でソケット通信をしてみる(Micropython)
ソケット通信,何するの?
ソケット通信の細かい仕組みの話は難しいので置いといて,どんなことをしているのかざっくりと説明します.
まず,クライアント側は以下のことを行います.
- ソケット作成
- bind
- connect
- send
- recv
- close
次に,サーバ側は以下のことを行います.
- ソケット作成
- bind
- listen
- accept
- recv
- send
- close
たくさんあります.listen,accept,recv(receive)に至ってはどれも似たようなことしそうですしね.混乱します.
ソケット作成
s = socket.socket()
ソケットを新規作成します.
bind
s.bind((address, port))
ソケットにアドレスをバインド(紐付ける)します.
でもaddressが決まってない時もありますよね.
そんな時は
s.bind(("",port))
これでaddressを指定せずにbindすることもできます.
バインド済みのソケットを再バインドすることはできません.
listen
s.listen(n)
サーバが接続を受け付けられるようにします.
電話で例えると着信拒否していない状態,来ていいですよーって受け入れ状態にしておくことです.
引数のnは任意の整数で同時に受け付けられるデバイスの数を指定します.
accept
s.accept()
後述するconnect()と対(?)になるものです.
接続を受け入れます.
電話で例えると電話に応答する部分に当たります.着信拒否していたら電話に出ることはできませんから,listen()している必要があります.
また,ソケットにアドレスをbindしている必要があります.
戻り値はconn,addrで,それぞれ接続先とのソケット,アドレスを返します.
connect
s.connect(address)
引数のaddressで接続先を指定します.接続先がacceptしている必要があります.
recv
s.recv(bufsize)
データを受信します.
引数のbufsizeで一度に受け取るデータサイズを指定します.
send / sendall
s.send()
s.sendall()
ソケットにデータを送信します.
close
s.close()
ソケットの接続を切断します.
