0

現場にいるクライアントからのさまざまなクライアント要求を処理する Windows サービスがあります。サーバー上に次のようなコードがあります。

    server.BeginAcceptTcpClient(ae.End(), null);   
    yield return 1;                                

    // socket connection has been established.
    TcpClient client;
    try {
        client = server.EndAcceptTcpClient(ae.DequeueAsyncResult());
    } catch (Exception e) {
        Log.Error(e.ToString());
        yield break;
    }

    using (client) {

        // Set up another listener.
        Start(server);

        using (Stream stream = client.GetStream()) {   

        ... All the work happens here and stream is returned to the client

        }
    }

これは、クライアントが request1 などのリクエストを送信し、reply1 を取得した場合には正常に機能しますが、クライアントがこの直後に request2 を送信した場合は、再度接続してから reply2 を受信する必要があります。場合によっては、この接続に最大 3 秒かかることがあります (3G クライアントを使用している場合)。

サーバーがリッスンし、接続が確立されている場合、複数のリクエストのストリームを介して受信/応答できる場所にしたいと思います。その後、クライアントから「終了」リクエストが送信された後、接続がドロップされます。これははるかに高速になると思いますが、これは可能ですか?

どんな助けでも大歓迎です。

4

1 に答える 1

0

最後に、@Idle_Mind は間違いなく正しい提案をしていました。using{} ブロックが原因で接続が保持されていました。using を最初に削除したときの問題は、最初のループの後でクライアントが誤って接続を閉じていたことです。

私はクライアント側の問題を修正し、ループして待機するだけで、最終的にタイムアウトする方法があるかどうかまだ疑問に思っていました (クライアントが 1 分間何もしない場合)。クライアントは接続を終了します。

于 2013-06-17T20:16:48.960 に答える