Raspberry Pi 3 & Python 開発ブログ☆彡

Raspberry Pi 3の使い方、設定をわかりやすく解説。Raspberry Pi3 Model B(Element14版)、Raspbian 8.0(NOOBS Ver1.9.2)を使用して開発中。

【スポンサーリンク】

Socket通信の仕方(サーバー側)

【スポンサーリンク】

今回はRaspberry Piでソケット通信を行う方法を紹介したいと思います。センサー等で取得したデータを他のパソコンに送る方法はいくつかありますが、ネットワークが繋がっていれば、ソケット通信でデータを送ることができます。
ネットワークは難しいから手が出ないという方もいると思いますが、汎用的に使えますので、覚えてしまうと便利です。

サンプルコードの内容

ソケット通信はクライアント⇔サーバー間でデータをやり取りする仕組みになっています。下記のサンプルコードは、"サーバーから文字を入力⇒クライアントに表示される⇒クライアントから文字を入力⇒サーバーに表示される"、というコードになります。

また、TCP/IPでソケット通信をする方法を紹介します。UDPはまだ後日...

構成

サーバー:Raspberry Pi IPアドレス 192.168.1.10 使用ポート:12345
クライアント:Raspberry Pi IPアドレス 192.168.1.15 使用ポート:12345
今回はTCP/IPでソケット通信をする方法を紹介します。UDPはまだ後日...

サーバー側のコード

・ソケットクラスをNewします。

⇒ s_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

IPアドレスとポートを設定します。

⇒ s_socket.bind( (HOSTNAME, PORT) )

クライアントの接続台数を設定します。

⇒ s_socket.listen(CLIENTNUM)

・accept()メゾットでクライアントからの接続要求を待ちます。接続が確立されると戻り値として、conn :接続を通じてデータの送受信を行うための 新しい ソケットオブジェクトと、address :接続先でソケットにbindしているアドレスを返します。

⇒conn, addr = s_socket.accept()

その後、クライアント毎にThreadを起動し、send()、recv()メゾットでデータのやり取りをしています。実際のサンプルコードは以下のようになります。

import socket
import threading
import time

HOSTNAME = "192.168.1.10"
PORT = 12345
CLIENTNUM = 3

class ConnClient(threading.Thread):

    def __init__(self,conn,addr):
        threading.Thread.__init__(self)
        self.stop_event = threading.Event()
        self.conn_socket = conn
        self.addr = addr

    def run(self):
        try:
            while (1):
                senddata = raw_input(str(self.addr)+" SendData:")
                self.conn_socket.send(senddata)
                recvdata = self.conn_socket.recv(1024)
                print "ReciveData:"+recvdata
                if (recvdata == "quit") or (senddata == "quit"):
                    break

        except socket.error:
            print "connect error"
 
        finally:
            self.conn_socket.close()
            print "connect close"

    def stop(self):
        self.conn_socket.close()

def main():
        s_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s_socket.bind((HOSTNAME, PORT))
        s_socket.listen(CLIENTNUM)
    
        while (1):
            conn, addr = s_socket.accept()
            print("Conneted by"+str(addr))
            connClientThread = ConnClient(conn,addr)
            connClientThread.setDaemon(True)
            connClientThread.start()    

if __name__ == '__main__':
    main()


少し長くなりましたので、今日はここまでにします。次回は、クライアント側のコードを紹介します。