以前に作った簡単なソケット通信を改造して、サーバー側の処理をスレッドに処理させることにする。こうすることで、複数のクライアントからの要求を同時に受け付けることができる。
—–
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!
今回は三つのクライアントから接続してみた。この方法だとスレッドが立てられるごとに、そのスレッドに新たなポート番号が振り分けられているはずなので、複数のクライアントが同時に文字列を送ってきたとしても、きちんと処理を行うべきスレッドに文字列が届く。