VITANのブログ

Techなことをメモしていきます

Pythonで非同期Socket通信をする

アドベントカレンダー 12/3の記事です.
Socket通信を行うとき、基本的に同期処理なので次のパケットを受信するまで待ちが入ります.しかし,受信しながら処理したいときは非同期受信をする必要があります.
asyncoreを使って非同期受信をするコードは調べればすぐ出てきますが,threadingを使ったコードはほとんど出てこないので実際にコードを書いてみました.このコードはUDP受信の例です.
プヨグラミング初心者なのでミス等あると思いますが許してやってください.
実行環境はpython2.7です.

# -*- coding: utf-8 -*-

import socket
import threading

UDP_IP = "0.0.0.0" #IPアドレス 受信側はlocalhost
UDP_PORT = 5005  #UDPパケット送受信に使うポート

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))


class prosess (threading.Thread): #マルチスレッド処理
     def run(self):
	  global data #変数のグローバル化
	 #################
         ####### 処理######	 
         #################	

t1 = prosess()
t1.start()

while True: #UDP受信 
       data, addr = sock.recvfrom(1024) #バッファ1024byte
       print "received message:", data  #受信したデータを表示

Socket通信の部分の説明は割愛します.
threading.Threadのクラスを継承したクラスprosessを作成してやって受信したデータ内容をグローバル変数にしてprosessのスレッドに渡してやる感じです,



いちおうクライアント側のコードも置いておきます. getchでキー操作を監視してキーが押されるごとに指定のアドレスにUDPパケットを送信します.

import socket
from getch import getch

UDP_IP = "IPアドレス"
UDP_PORT = 5005


while True:

 text = getch()
 
 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
 sock.sendto(text, (UDP_IP, UDP_PORT))