Pythonでネットワークプログラミング(1)
- 作者: 雪田修一
- 出版社/メーカー: 技術評論社
- 発売日: 2003/06/05
- メディア: 単行本
- 購入: 5人 クリック: 84回
- この商品を含むブログ (15件) を見る
7章まで読んだ。最後まで読み終わる前に、居ても立ってもいられず、Pythonで同じことをやりたいときには、どのような実装になるのかを調べてみた。
このへんを参考にして。
Recipe 52218: Message Passing With Socket Datagrams
Python Library Reference 17.2.3 Example
チャットプログラムの実装
上記本の中の最初の例として、チャットプログラムが示されている(第2章)。サーバプロセスとクライアントプロセスの間で、メッセージのやり取りを行うプログラム。どんなものかというと、
- 通信にはコネクション型を用いる。
- メッセージの入力は交互に行う。
- 相手のメッセージは自分の画面に表示される。
- チャットを終了するには、quitと入力する。
これのPython版を作成してみた。
サーバプログラムは以下の通り。
# file name: server.py import socket HOST = 'localhost' #サーバプログラムを動作させるホストを入力 PORT = 50007 #接続するポート番号指定 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) #サーバのアドレスをソケットに設定 s.listen(1) #1つの接続要求を待つ soc, addr = s.accept() #要求が来るまでブロックする print 'Conneted by', addr print 'Go ahead!' #サーバ側から先に書き込む while 1: data = raw_input('(server) > ') #サーバ側の入力 soc.send(data) #ソケットに書き込む data = soc.recv(1024) #1024バイトまでのデータを受け取る print '(client) >',data if data == "quit": #quitが入力されたら終了 break soc.close()
クライアントプログラムは以下の通り。
# file name: client.py import socket HOST = 'localhost' #サーバプログラムを動作させるホストを入力 PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) print 'Wait!' #サーバ側の書き込みを待つ while 1: data = s.recv(1024) #データの受信(1024バイトまで) print '(server) >', data data = raw_input('(client) > ') #クライアント側の入力 s.send(data) #ソケットに書き込む if data == "quit": #quitが入力されたら終了 break s.close()
プログラムの実行方法
テストのため、localhostで実行してみる。
- ターミナル画面を2つ開く。
- 一方の画面(サーバ側画面)で、python server.pyを実行する。画面には何も表示されない。
- 次に、もう一方の画面(クライアント側画面)で、python client.pyを実行する。このとき、サーバ側の画面に、「Go ahead!」とプロンプトが表示されるので、メッセージを入力する。
- サーバ側から書きこんだメッセージが、クライアント側画面に表示される。同時にプロンプトも表示され、書き込み準備される。
- 次に、クライアント側画面からメッセージを入力する。その内容がサーバ側画面に表示される。
- 以後、交互にメッセージを入力する。
- 終了は、どちらかの画面で「quit」を入力する。