ソケット通信をスレッドで処理してみる

Foundations of Python Network Programming

以前に作った簡単なソケット通信を改造して、サーバー側の処理をスレッドに処理させることにする。こうすることで、複数のクライアントからの要求を同時に受け付けることができる。

—–



simpleserver.pyを改造したthreadserver.pyを作成する。clientは引き続きsimpleclient.pyを作成する。simpleserver.pyの実行結果を見ると、途中から新たなクライアントが接続してきているのが分かる。各スレッドは、クライアントから空白文字列を受信すると廃棄されるようにする。

threadserver.py

import socket, threading, time
host = ''
port = 15000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(1)
def threadfunc(sock):
print '%s is created!' % (threading.currentThread().getName())
while 1:
rcvmsg = sock.recv(1024)
time.sleep(1)
if rcvmsg == '':
break
else:
print '%s received -> %s' % (threading.currentThread().getName(), rcvmsg)
sock.close()
print '%s is terminated!' % (threading.currentThread().getName())
while 1:
try:
clientsock, clientaddr = s.accept()
except:
break
t = threading.Thread(target = threadfunc, args = [clientsock])
t.setDaemon(1)
t.start()

実行結果。

>>>
Thread-1 is created!
Thread-1 received -> message1
Thread-1 received -> message2
Thread-1 received -> message3
Thread-2 is created!
Thread-2 received -> first message
Thread-2 received -> second message
Thread-1 received -> message4
Thread-3 is created!
Thread-3 received -> 1st message
Thread-2 received -> third message
Thread-1 is terminated!
Thread-3 received -> 2nd message
Thread-2 is terminated!
Thread-3 received -> 3rd message
Thread-3 is terminated!

今回は三つのクライアントから接続してみた。この方法だとスレッドが立てられるごとに、そのスレッドに新たなポート番号が振り分けられているはずなので、複数のクライアントが同時に文字列を送ってきたとしても、きちんと処理を行うべきスレッドに文字列が届く。