私は作成しているゲーム用のC#サーバーを作成しており、マルチスレッドとソケットプログラミングを初めて使用しています。私のサーバーは、複数のクライアントをすべて別々のスレッドで保持できる必要があります。私のサーバーはコンソールアプリケーションとして実行されます。私の唯一の問題は、テストクライアントの1人がアプリケーションを終了するときに、実行中のスレッドを停止する方法がわからないことです。実行中にスレッドを停止するにはどうすればよいですか?ゲームサーバーのマルチスレッドエラー
0
A
答えて
0
あなたのスレッドは基本的にクライアントからの要求を待って応答を処理するメッセージ処理スレッドだと仮定します。その場合、スレッドのメインループは以下のようなHandleClientRequestsメソッドのように見えるかもしれません。この例では、正常な切断を前提としています。堅牢な実装では、クライアントが適切なシャットダウンシーケンスを実行せずに接続を切断したり、ある時点で接続が失敗する可能性も考慮されます。
public class ClientConnection {
private Socket _socket;
public ClientConnection(Socket socket) {
_socket = socket;
new Thread(HandleClientRequests);
}
/* snip */
public void HandleClientRequests() {
bool disconnectRequested = false;
while(!disconnectRequested) {
var message = ReadNextMessageFromSocket();
if(message.Type == MessageType.CloseConnection) {
disconnectRequested = true;
} else {
//service request and send response
}
}
ShutdownConnection();
//after this point the thread terminates
}
}
いずれにせよ、あなただThreadStartメソッドは通常、あなたはあなたがあなたのスレッドが何をしたいされて何でもその中に、ループのいくつかの種類を持っている必要があり、そのループを知らせるために使用された条件を持っている必要がありますそれはスレッドが終了する時間です。
0
スレッドは、関数が返ったときに終了します。あなたのスレッドは、クライアントが離れてスレッドループから離れたことを認識する必要があります。
関連する問題
- 1. Javaのマルチスレッドエラー `java.lang.IllegalMonitorStateException`
- 2. ゲームサーバーの作成
- 3. PythonゲームサーバーのTCPソケット
- 4. ゲームサーバーのMySQL接続
- 5. エンティティフレームワークとゲームサーバー
- 6. iPhoneとAndroidゲームサーバー
- 7. WASDゲームサーバーのネットワーク要件
- 8. PHPゲームサーバー、複数のTCPクライアント?
- 9. C#非同期処理とマルチスレッドエラー
- 10. ゲームサーバーとしてのフレームワークを再生
- 11. Pythonのマルチスレッドエラー "グループ引数は今のところはNone"
- 12. ゲームサーバーを作成していますか?
- 13. JavaゲームサーバーからクライアントへのTCPとUDPの接続
- 14. リアルタイムTCP/IPゲームサーバーの良いホストは誰ですか?
- 15. ゲームサーバーにとって最高のクラウドコンピューティングプラットフォームは何ですか?
- 16. どのようにゲームサーバー:ASIO仕事非同期?
- 17. TBB C++マルチスレッドエラー:呼び出しに一致する関数がありません
- 18. Javaでゲームサーバー側を推測するバイナリ検索
- 19. ゲームサーバーがオンラインかどうかを確認するPHPコード
- 20. Apache mod_proxyポートがゲームサーバーにリダイレクトされていますか?
- 21. ゲームサーバーがオンラインかどうかを確認するnodejs
- 22. ゲームサーバーのログイベントに基づくプレーヤーの統計情報のMongoDBスキーマ設計?
- 23. PHP - 自分のゲームサーバー用のチャットボットを作成しようとしています
- 24. ゲームサーバーのローディング画面を設定しようとしています
- 25. より良い方法は、Webインターフェイスを使用してゲームサーバーを作成する
- 26. ゲームサーバーから新しいデータを取得し続けるログファイルを読み取る
- 27. BDEマルチスレッドエラー:ora-12560に遭遇したとき、TDatabaseを再起動できません
- 28. ユニークな整数からのユニークな英数字の文字列ですか? (ゲームサーバーのIDをマスキングする)
- 29. ゲームサーバーの書き換え、フォワーダの書き込み、または新しいプラグインの使用はできますか?
- 30. Azureのゲームサーバー、どのCPU(VMサイズ)を選択する必要がありますか?
クライアントごとのスレッドを使用しないでください。 [恥知らずのプラグ](http://jonathan.dickinsons.co.za/blog/2011/02/net-sockets-and-you/) - try/catchはあなたのスレッドを「終了」する場所です。 –