- ベストアンサー
ソケット通信において、サーバからクライアントに任意のタイミングでデータを送る方法
ソケット通信において、接続されているクライアントに対しサーバ側から任意のタイミングでデータ送るにはどんな方法があるか教えてください。 例えば1分ごとに、接続されているクライアント全体にメッセージを送りたい、といった場合にどうすればよいでしょうか。 ちなみに対戦ゲームのようなものを作ろうと思っています。 クライアントはFlash、サーバはperlで開発しています。 クライアントからのデータに応じて何かを返すところまではできたのですが、サーバ側をトリガーとしてデータを送る手段がわからなかったので質問しました。 よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
Perlに限りませんが、おおざっぱにまとめると以下のようなものになると思います。 【スレッドを使わない場合】 1. サーバプロセス常駐開始 2. 任意のポートをlisten&クライアントからの接続をaccept 3. 全クライアントに同報したいタイミングまでsleep(コンマ秒以下の精度で待ちたい場合はselect) ※ この間も2の処理やクライアントからのreadなどを行いたい場合はノンブロッキングI/Oを駆使してがんばる 4. 全クライアントへノンブロッキングで一気にwrite 5. 3へ戻る 【スレッドを使う場合】 1. サーバプロセス常駐開始 2. メインスレッドにてlisten開始 3. acceptしたら、そのクライアント専用のスレッドを作成 あとの処理はそのスレッドに任せ、メインスレッドは2に戻る 4. クライアント専用スレッドは、何も考えずにその特定クライアントとの通信を必要に応じて行う しかしメインスレッドからの同報要求があれば真っ先に対応する 5. 何か同報したいデータがあれば、メインスレッド(あるいは同報専用スレッドを用意)から全クライアント専用スレッドへ何かしらの手段でスレッド間通信を行う スレッドを使ってしまえば楽ですが、1クライアント毎に1スレッドが生成されますので、クライアント数が大きい場合(数千など)はさばききれないかもしれません。 以上ご参考まで。
補足
さっそくの回答ありがとうございます。すみませんが確認させてください。 スレッドを使う場合で、質問のような「1分ごと」を計測したい場合、メインスレッドでsleepを実施することになるのでしょうか? 1分を計測しつつも新しいクライアントが接続してきたかどうかもキャッチしたいのですが、そうするとメインスレッドは【スレッドを使わない場合】と同様にノンブロッキングI/Oというものを使ってsleepとlistenを両立させるということになりますか?