3

Android アプリケーションに合わせて C# で非同期サーバーを作成しました。サーバーは次のようになります: http://msdn.microsoft.com/en-us/library/fx6588te.aspx

それはうまく機能し、同時に多くのクライアントを接続してサーバーからデータを受信することができます。私が見つけた問題の 1 つは、私の Android アプリで、既に Wifi 経由で接続しているときに接続ボタンをもう一度押すと、サーバーが新しいソケットを生成することです。サーバーはまず古い接続を切断してから、新しい接続を作成する必要があります。Android 側では、必ず呼び出しclose()て、後で null に設定します。close()また、切断制御信号をサーバーに送信して、ソケットでも呼び出せるようにします。たとえば、サーバーで行う方法は次のとおりです。

if (state.storage.parseJson(content) == JsonStorage.DISCONNECT)
{
    Console.WriteLine("Disconnect2!");
    state.workSocket.Shutdown(SocketShutdown.Both);
    state.workSocket.Close();
    return;
}

「CurrPorts」というプログラムでサーバー プロセスを調べると、異なるポートで Android デバイスに対して開いている複数の接続が表示されます。Timer オブジェクトを使用してクライアントにデータを送信し、接続がアクティブかどうかも確認します。そうでない場合は閉じます。たとえば、私の TimerCallback メソッド:

public void TimeCallBack(object input)
{
    StateObject state = (StateObject)input;
    if (state.workSocket.Connected)
    {
        Send(state.workSocket, state.storage.getJson());
    }
    else
    {
        Console.WriteLine("Dispose!");
        state.timer.Dispose();
        state.workSocket.Close();
    }
}

サーバーが古い接続を閉じない理由がわかりません。サーバーに接続されているデバイスと同じ数の接続のみを開く必要があります。これがスレッド化されたブロッキング サーバーである場合、スレッドを閉じるのは簡単ですが、この場合はどうすればよいかわかりません。

編集:だから、しばらく放置した後、CurrPortsプログラムを更新したところ、確立された接続が1つになりました。私の解決策は正しいですか?Windowsが作成された古いソケット接続を実際にクリアするのに少し時間がかかりますか?

4

1 に答える 1

1

はい、Windows はソケットに関する情報をしばらく保持します。これは netstat で確認できます。閉じられたソケットは、閉じられた後、およびソケットをホストしていたアプリケーションが終了した後でも TIME_WAIT の状態を示します。

于 2012-07-18T20:10:47.827 に答える