Python Socket Server〜Python低水準ソケット通信〜

イントロダクション

タイトルにある「低水準」を見て「しょっぱそうな。。。」と感じた方、大外れでございます。

最近の言い方だと「ローレベルAPI」に属するAPI(クラス)で低水準(ローレベル)=細かい設定がいらないと言うことです。

その代わり、高レベルAPI(クラス)と違い、便利な機能が付いていないため自分で実装する必要があります。今回使用する「socket」に関しても同様なことが言えます。

いざSocket通信

もしかしたら「pip install socket」とコマンドを打つ必要があるかもしれません。今までに色々とインストールしたもので。。。

今回は、簡単なソケット通信を行い(実装し)ます。ソケット通信は古い技術です、細かいことはPyhonドキュメントを参照されたし。

概要

ソケットサーバーとクライアントを作成して以下のことを確認します。

  1. クライアントからデータを飛ばす
  2. サーバーで受け取ったものをコンソールに表示
  3. クライアントでレスポンスを受ける

実際に実行するときは、pythonを2つ起動するのでコンソール(ターミナル)も2つ立ち上げた状態になります。※背景にワードプレスくさいのがありますが、気にしないでください。。。

<実行結果:クライアント>

<実行結果:ソケットサーバー>


これは、Pythonだけで完結することができますが今までの経緯もあり、Microbitからの入力を受け付けてソケットサーバーへ通信しました。

  1. MicrobitでHttpリクエストを飛ばすためのメモ
  2. Microbitで遊ぶ〜ボタンを押す〜
  3. Microbitで遊ぶ〜シリアル通信をする〜
  4. 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()

あとは改造して、何をやろうかな?といった感じです。

関連ページ一覧