ソケット通信において、接続されているクライアントに対しサーバ側から任意のタイミングでデータ送るにはどんな方法があるか教えてください。
例えば1分ごとに、接続されているクライアント全体にメッセージを送りたい、といった場合にどうすればよいでしょうか。
ちなみに対戦ゲームのようなものを作ろうと思っています。
クライアントはFlash、サーバはperlで開発しています。
クライアントからのデータに応じて何かを返すところまではできたのですが、サーバ側をトリガーとしてデータを送る手段がわからなかったので質問しました。
よろしくお願いいたします。
No.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を両立させるということになりますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP でメールフォームを作成したい 1 2022/05/04 22:28
- ノートパソコン ESETの初期インストールの仕方 1 2022/10/14 08:26
- サーバー FTPサーバについて詳しい方(アクセス権のないディレクトリを非表示にする方法) 4 2022/08/22 22:33
- ネットワーク 社内ネットワークの1台だけ接続できないときがある 4 2023/01/25 11:58
- その他(データベース) 数百社を超えるクライアントから依頼が来る際、各社さまざまなフォーマット、形式、(情報が行で記載されて 2 2022/04/07 23:17
- サーバー ファイルサーバのデータのバックアップ 1 2023/03/15 10:30
- その他(メールソフト・メールサービス) メールが送信できない 発信側でできる対策 3 2023/05/11 10:22
- Android(アンドロイド) Androidスマホのデータ移行が終わらない 1 2023/08/04 17:25
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- ルーター・ネットワーク機器 ネットワーク共有フォルダーにWi-Fiで接続したい 4 2022/06/17 00:01
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
NetworkStreamからのRead()で、...
-
ソケット通信において、サーバ...
-
別のサーバにリクエストを飛ば...
-
ブラウザ環境で振り分ける
-
perl cgiのサーバ負荷について
-
サーバーの仕組みについて
-
サーバの同期をとる
-
asp.net の質問です。
-
ASPとCGIの違い
-
WindowsXP自宅サーバでのCGIの...
-
三菱GOTの画面切り替えについて
-
C言語で今まで表示していた画面...
-
フォームで同じ複数のnameで違...
-
ボタンが活性化の場合とは、ボ...
-
strutsを使用したjspでjavascri...
-
フォーム上で押されたボタンに...
-
javascriptでセッションを取得
-
「<c:forEach タグが終了し...
-
webアプリを作ってます。エラー...
-
ラジオボタンの選択肢をサーブ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
NetworkStreamからのRead()で、...
-
IIS+VBScriptでの処理待ちについて
-
JSPでのリアルタイムな時刻表示
-
ASPとCGIの違い
-
CPUを2つ搭載するといいのです...
-
<%@ language="VBScript" %>
-
サーバーの仕組みについて
-
ASPでDLLの呼び出し
-
RedirectとTransferの違い
-
一定時間でPostBackさせたい(A...
-
ASP.NET MVCのAjaxフォーム検証
-
Webサービスについて(基になる...
-
処理終了後、他のプログラムへP...
-
CGI(Perl)のメッセージボックス...
-
画面サイズ取得について
-
【php】プログラムの設計案
-
COBOL97,Power-COBOLでの効率の...
-
3層クライアントサーバとMVCの関係
-
簡易DBの作成方法について
-
VC++のHTTP通信
おすすめ情報