2つのPythonアプリでsocketを使った通信をして、結果をtkinterを使ったGUIに表示してみます。Appendix では単にprint表示するだけのシンプルコードも付けておきました。
【送信側】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#!/usr/bin/env python3 # -*- coding: utf8 -*- import socket HOST = 'localhost' PORT = 51000 def com_send(mess): while True: try: # 通信の確立 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST, PORT)) # メッセージ送信 sock.send(mess.encode('utf-8')) # 通信の終了 sock.close() break except: print ('retry: ' + mess) if __name__ == "__main__": com_send("ok") |
【受信側】
TkinterのGUIに表示します。
受信は別スレッドで待ち受けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
#!/usr/bin/env python3 # -*- coding: utf8 -*- import tkinter from tkinter import ttk from socket import socket, AF_INET, SOCK_STREAM import threading HOST = 'localhost' PORT = 51000 MAX_MESSAGE = 2048 NUM_THREAD = 4 CHR_CAN = '\18' CHR_EOT = '\04' cuiroot = tkinter.Tk() cuiroot.title(u"information panel") cuiroot.geometry("350x400+100+50") var1 = tkinter.StringVar() def com_receive(): #global sock sock = socket(AF_INET, SOCK_STREAM) sock.bind ((HOST, PORT)) sock.listen (NUM_THREAD) print ('receiver ready, NUM_THREAD = ' + str(NUM_THREAD)) while True: try: conn,addr = sock.accept() mess = conn.recv(MAX_MESSAGE).decode('utf-8') conn.close() if(mess == CHR_EOT): break if(mess == CHR_CAN): continue message('MESSAGE:' + mess) except: print('Error') sock.close() def message(mes): var1.set(mes) def com_start(): #別スレッドで待ち受け th=threading.Thread(target=com_receive) th.start() frame1 = ttk.Frame( cuiroot, padding=5) frame1.grid() #このラベルに表示 label1 = tkinter.Label( frame1, anchor="nw", width=40, height=20, foreground="#ff0000", background='#000000', textvariable=var1) label1.grid(row=2,column=1) com_start() cuiroot.mainloop() |
localhostをIPアドレスに書きかえれば、ラズパイ間でメッセージを交換できます。
ここでの通信は1対1のユニキャストです、1体多のマルチキャストはこのページ参照。
Appendix
シンプルに受けたらprintするだけの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#!/usr/bin/env python3 # -*- coding: utf8 -*- from socket import socket, AF_INET, SOCK_STREAM HOST = 'localhost' PORT = 51000 MAX_MESSAGE = 2048 NUM_THREAD = 4 CHR_CAN = '\18' CHR_EOT = '\04' def com_receive(): #global sock sock = socket(AF_INET, SOCK_STREAM) sock.bind ((HOST, PORT)) sock.listen (NUM_THREAD) print('receiver ready,NUM_THREAD = ' + str(NUM_THREAD)) while True: try: conn,addr = sock.accept() mess = conn.recv(MAX_MESSAGE).decode('utf-8') conn.close() if(mess == CHR_EOT): break if(mess == CHR_CAN): continue print('MESSAGE:' + mess) except: print('Error') sock.close() com_receive() |
Leave a Reply