イントロダクション
タイトルにある「低水準」を見て「しょっぱそうな。。。」と感じた方、大外れでございます。
最近の言い方だと「ローレベルAPI」に属するAPI(クラス)で低水準(ローレベル)=細かい設定がいらないと言うことです。
その代わり、高レベルAPI(クラス)と違い、便利な機能が付いていないため自分で実装する必要があります。今回使用する「socket」に関しても同様なことが言えます。
いざSocket通信
もしかしたら「pip install socket」とコマンドを打つ必要があるかもしれません。今までに色々とインストールしたもので。。。
今回は、簡単なソケット通信を行い(実装し)ます。ソケット通信は古い技術です、細かいことはPyhonドキュメントを参照されたし。
概要
ソケットサーバーとクライアントを作成して以下のことを確認します。
- クライアントからデータを飛ばす
- サーバーで受け取ったものをコンソールに表示
- クライアントでレスポンスを受ける
実際に実行するときは、pythonを2つ起動するのでコンソール(ターミナル)も2つ立ち上げた状態になります。※背景にワードプレスくさいのがありますが、気にしないでください。。。
<実行結果:クライアント>
<実行結果:ソケットサーバー>
これは、Pythonだけで完結することができますが今までの経緯もあり、Microbitからの入力を受け付けてソケットサーバーへ通信しました。
- MicrobitでHttpリクエストを飛ばすためのメモ
- Microbitで遊ぶ〜ボタンを押す〜
- Microbitで遊ぶ〜シリアル通信をする〜
- Microbit Python 〜シリアル通信データを受け取る〜
<クライアントサイドのPythonコード>
import serial import time import socket import socketTest def main(): # マイクロビットからシリアル通信を受け取る処理 ser = serial.Serial('/dev/tty.usbmodemFA132', 115200, timeout=3) ser.flushInput() ser.flushOutput() while True: try: print("Send data from Micro Bit with in 3 seconds!") data_raw = ser.read(10) if (data_raw != ""): print(data_raw) # シリアル通信で受け取ったデータをソケットサーバーへ sendServer(data_raw) else: print("It is Time out try one more!") except: print("Error") else: print("End Program") ser.close() break def sendServer(msg): HOST = "localhost" PORT = 8000 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) s.send(msg) # サーバーからの返信を受け取る data = s.recv(1024) print(repr(data)) s.close() if __name__ == '__main__': # 「__name__」の値がメインの時※「__name__」にはいろんな値が入ってくる main()
<サーバーサイドのPythonコード>
import socket import time def main(): print("Exe MySocket.py") server = initSocket() #s.connect( ( "localhost", 8000 ) ) # ソケットサーバーの受信開始処理 con, addr = server.accept() print("Got connection: ") print(addr) while True: #クライアントからのデータ受信 data = con.recv(1024) print(data) if not data: print("there is no data...") break con.send("getMessage!: " + data) print("Good bye!") con.close() def initSocket(): # ソケットの初期処理 port = 8000 sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) sock.bind(('', port)) sock.listen(5) print("start listen...") return sock if __name__ == '__main__': main()
あとは改造して、何をやろうかな?といった感じです。