プログラム間通信をするための勉強メモ.
socket プログラムの練習で簡単なチャット(もどき)をするためのプログラムを作ったが,会話のキャッチボールをしなければいけなかった.
つまり,一回メッセージを受信したら一回メッセージを送信する,ということの繰り返しであった.
逆に言うと,メッセージを続けて2回以上送信(あるいは受信)できなかった.
これは recv() がメッセージを受信するまで待ち状態になるため,他のことができないためである.
送信するためのメッセージを入力するための raw_input() も,キーボードからの入力を待つので入力が完了するまで他のことができない.
この点を何とかしなければならない.
これは fork を使ってマルチプロセスにすることで対応できる.
一方のプロセスが recv() で待ち状態で止まっている間,他方のプロセスは別のことができる.
前回のエントリーにメモしたように fork についても例題で動作を確認した.
これらを組み合わせてみる.
サーバーもクライアントも,親プロセスでメッセージを受けて,子プロセスでメッセージを送信する.
親がメッセージ受信待機中でも子プロセスで何度でもメッセージの送信を行うことができる.
"." を入力すると,その子プロセスは終了する."." を受け取った側のサーバーは,その側の子プロセスを閉じて,自分も終了する.この終了により相手側のサーバーも "End" を表示して終了する.
実行結果は以下のようになる.
これで,socket と fork を用いて chat のようなことができた.
プログラム間通信関連メモの目次
socket プログラムの練習で簡単なチャット(もどき)をするためのプログラムを作ったが,会話のキャッチボールをしなければいけなかった.
つまり,一回メッセージを受信したら一回メッセージを送信する,ということの繰り返しであった.
逆に言うと,メッセージを続けて2回以上送信(あるいは受信)できなかった.
これは recv() がメッセージを受信するまで待ち状態になるため,他のことができないためである.
送信するためのメッセージを入力するための raw_input() も,キーボードからの入力を待つので入力が完了するまで他のことができない.
この点を何とかしなければならない.
これは fork を使ってマルチプロセスにすることで対応できる.
一方のプロセスが recv() で待ち状態で止まっている間,他方のプロセスは別のことができる.
前回のエントリーにメモしたように fork についても例題で動作を確認した.
これらを組み合わせてみる.
=== Server === | === Client === | |
import os | import os |
サーバーもクライアントも,親プロセスでメッセージを受けて,子プロセスでメッセージを送信する.
親がメッセージ受信待機中でも子プロセスで何度でもメッセージの送信を行うことができる.
"." を入力すると,その子プロセスは終了する."." を受け取った側のサーバーは,その側の子プロセスを閉じて,自分も終了する.この終了により相手側のサーバーも "End" を表示して終了する.
実行結果は以下のようになる.
=== Server === | === Client === | |
6:37.amarone[11883]python server.py | 6:37.amarone[11882]python client.py |
これで,socket と fork を用いて chat のようなことができた.
プログラム間通信関連メモの目次