Python を使ったプログラム間通信の仕方の勉強の続き.
前回は UDP を使って,通信相手をみつけ,その後,TCP を使って相手と通信を行うところまでたどり着いた.
しかし,情報を受け取るために socket の recv() 関数を使っていたので,複数パケットに分割して送られてきた情報をまとめて受信,ということができなかった.
このため,長い文章などを受け取るときに,途中でとぎれるという現象がおきていた.
これを解決したい.
そこで,情報受信側に SocketSever の TCPServer を使うことにした.
このとき,SocketServer.StreamRequestHandler を継承した MyTCPHandler クラスを実装し,TCPサーバーを作成するときに MyTCPHandler をクラスを引き渡す.
この MyTCPHandler の中で socket.recv() の代わりを果たすのが,self.rfile.readline().strip() という部分だ.
self.rfile は,Handler が作成したファイルのようなオブジェクトである.readline() 関数はソケットから流れ込んでくる文字列の中に '\n' を見つけるまで読み続けることができる.
Sender は前回と同じだが,長い文字列を作成するようになっている.
TCPServer を使って文字列を送信するには,socket の send() の代わりに,同じくファイルのような Handler のオブジェクト self.wfile を使って self.wfile.write(data) とすることができる.
また TCPServer をアクティブにするために例では sever.handle_request() を実行しているが,sever.server_forever() という関数で,待機し続ける状態にすることもできる.
server.server_forever() を停止するには,server.server_shutdown() を使う.
上記 Sender と Receiver をそれぞれ同一ネットワーク上に存在する1台のマシン(計2台)で実行してみる.
実行結果は以下のようになる.
受信側の結果をみると,送られてきたのは長い文字列だが,最後まで受信できていることがわかる.
プログラム間通信関連メモの目次
前回は UDP を使って,通信相手をみつけ,その後,TCP を使って相手と通信を行うところまでたどり着いた.
しかし,情報を受け取るために socket の recv() 関数を使っていたので,複数パケットに分割して送られてきた情報をまとめて受信,ということができなかった.
このため,長い文章などを受け取るときに,途中でとぎれるという現象がおきていた.
これを解決したい.
そこで,情報受信側に SocketSever の TCPServer を使うことにした.
このとき,SocketServer.StreamRequestHandler を継承した MyTCPHandler クラスを実装し,TCPサーバーを作成するときに MyTCPHandler をクラスを引き渡す.
この MyTCPHandler の中で socket.recv() の代わりを果たすのが,self.rfile.readline().strip() という部分だ.
self.rfile は,Handler が作成したファイルのようなオブジェクトである.readline() 関数はソケットから流れ込んでくる文字列の中に '\n' を見つけるまで読み続けることができる.
Sender は前回と同じだが,長い文字列を作成するようになっている.
=== Sender === | === Receiver === | |
from socket import * | import SocketServer |
TCPServer を使って文字列を送信するには,socket の send() の代わりに,同じくファイルのような Handler のオブジェクト self.wfile を使って self.wfile.write(data) とすることができる.
また TCPServer をアクティブにするために例では sever.handle_request() を実行しているが,sever.server_forever() という関数で,待機し続ける状態にすることもできる.
server.server_forever() を停止するには,server.server_shutdown() を使う.
上記 Sender と Receiver をそれぞれ同一ネットワーク上に存在する1台のマシン(計2台)で実行してみる.
実行結果は以下のようになる.
=== Sender === | === Receiver === | |
17:16.montepulciano[11] python sender.py | 17:16.barbaresco[43] python receiver.py |
受信側の結果をみると,送られてきたのは長い文字列だが,最後まで受信できていることがわかる.
![やじるし](https://emoji.ameba.jp/img/user/yu/yuka-k-blog/12799.gif)