TCPソケットを使用してクライアントサーバーアプリケーションを作成しています。このサーバーはVisual Studio 2010(.NET 4.0)を使用してC#で作成されています。サーバーは複数のクライアント接続を同時に許可するので、私はAsyncを使用しています。スタイル。サーバーはデータベース(MySQL)に接続する必要があり、サーバープログラムが実行されている間はデータベースと対話する必要があります。この理由から私はインターフェイスがフリーズするのを防ぎ、ビジュアルインターフェイスからデータベースにアクセスできるように無限のリスニングループ(クライアントを受け入れる)を実行するためにBackgroundWorkerを使用しています。C#サーバーがフォーカスを失ったときにクライアントが接続した場合のサーバーの終了/クラッシュ
サーバープログラムが重視されない限り、すべてうまくいきます。フォーカスを失う例:サーバープログラムを実行しているPCがスクリーンセーバーを起動し、タスクバーの時計をクリックして時間を表示し、別のウィンドウ(Windowsエクスプローラ、電卓など)を開きます。サーバープログラムがフォーカスを失ってクライアントが接続しようとすると、サーバーは完全に閉じます。 Visual Studioからサーバーを実行している場合、エラーまたは例外はスローされません。リリースされたバージョンのサーバーを実行している場合、Microsoft Windowsは「応答しないプログラミング...」ダイアログを表示します。ここで
は私のコードが構成されている方法です:メインクラスで
変数:メインフォームで
const int portNo = 12345;
static System.Net.IPAddress localAdd = System.Net.IPAddress.Parse("192.168.1.67");
static TcpListener tcpListenerReadWrite = new TcpListener(localAdd, portNo);
ボタンは、サーバーを起動します:
private void button1_Click(object sender, EventArgs e)
{
tcpListenerReadWrite.Start();
backgroundWorker1.RunWorkerAsync();
}
バックグラウンドワーカーDoWork機能:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
ChatClient clientRead = new ChatClient(tcpListenerReadWrite.AcceptTcpClient());
}
}
サーバクラスの
は、コンストラクタは以下の通りである:
public void ReceiveMessage(IAsyncResult asyncResult)
{
//read received message from client
}
つ最終ノート:(1)クライアントがサーバーに接続メッセージがサーバによって受信される
public ChatClient(TcpClient client) //constructor
{
_client = client;
_clientIP = client.Client.RemoteEndPoint.ToString();
//start reading data from the client in a separate thread
data = new byte[_client.ReceiveBufferSize];
_client.GetStream().BeginRead(data, 0, Convert.ToInt32(_client.ReceiveBufferSize), ReceiveMessage, client);
}
最初に行うことはHelloメッセージのようなサーバーにメッセージを送信することです(2)サーバーをビジュアルインターフェイスに書き込む前にConsoleモードでテストしていましたが、この問題は存在しませんでした。起こりました。もちろん、コンソールモードでは私はBackgroundWorkerを使用しませんでした。
サーバーがクラッシュする理由を教えてください。
私はその動作を再現できません...そのバハビールで最小の作業サンプルを投稿できますか? – DarkSquirrel42
申し訳ありませんが、私はあなたを取得していない、詳細なコードを投稿する必要がありますか、状況のより良い説明が必要ですか? :) – antf
コードサンプル... 1)コードサンプルはエラーを再現する必要があります2)コードサンプルは最小限に抑えてください(これと何の関係もないコードなし) – DarkSquirrel42