0

クライアントは、サーバーへのいくつかの tcp 接続を同時に構築する必要があります。私のサーバーのコードは以下です。

while (_running)
{
    if (!_listener.Pending())
    {
        Thread.Sleep(100);
        continue;
    }

    TcpClient client = _listener.AcceptTcpClient();
}

そして、私のクライアントのコードは以下です。

for (int i = 0; i < num; i++)
{
    TcpClient tcp = new TcpClient();
    tcp.Connect(_server);
}

最初の接続は成功です。しかし、サーバーの応答がないため、2 番目の接続は失敗します (実際にはサーバーは tcp 接続をリッスンしています)。
ただし、Thread.Sleep(1500)各 tcp.Connect() の後に追加すると、すべての接続が成功します。ただし、この状況は、1 つのクライアントと 1 つのサーバーがある場合にのみ当てはまります。多くのクライアントがある場合、サーバーが受け入れることができる各接続をどのように確認できますか? また、Thread.Sleep を追加すると、このような接続を成功させることができるのはなぜですか?

4

2 に答える 2

0

私は同じ仕事をしていました。私は運がない.Net用のこのタスクの正規の実装を探しました。私が現在使用しているアプローチを以下に説明します。

本旨

接続を受信し、ハンドラーに接続を渡し、できるだけ早く新しい接続のリッスンを開始するには、リスナーが必要です。

実装

AutoResetEvent _stopEvent = new AutoResetEvent(false);
object _lock = new object();

public void StartListening()
{
    _listener.BeginAcceptTcpClient(ConnectionHandler, null);
    _stopEvent.WaitOne();//this part is different in my original code, I don't wait here
}

public void StopListening()
{
    lock(_lock)
    {
        listener.Stop();
        listener = null;                
    }

    _stopEvent.Set();//this part is different in my original code
}

void ConnectionHandler(IAsyncResult asyncResult)
{
    lock(_lock)
    {
        if(_listener == null)
            return;

        var tcpClient = _listener.EndAcceptTcpClient(asyncResult);
        var task = new MyCustomTask(tcpClient);
        ThreadPool.QueueUserWorkItem(task.Execute);

        _listener.BeginAcceptTcpClient(ConnectionHandler,null);             
    }
}

ConnectionHandler で _listener.BeginAcceptTcpClient を呼び出すことにまだあまり自信がありませんが、別の方法は見つかりませんでした。

于 2012-12-29T16:50:57.650 に答える
0

満足のいく答えがまだないため、最終的に別のアプローチを使用してケースを処理します。class を使用すると、 andSocketを使用するよりも高速で安定していることがわかりました。とを使用する別のアプローチを試みました。まず、クライアントの有無にかかわらずリッスンしていましたが、クライアント接続を無視している可能性があります。Sencondly、非同期メソッドを使用しましたが、まだ成功せず、クライアント接続を無視しています。最後に の代わりに使用すると、前者は遅延がほとんどなく、クライアントへの応答が非常に高速です。TcpListenerTcpClientTcpListenerTcpClientTcpListener.AcceptTcpClientTcpListener.PendingTcpListener.BeginAcceptTcpClientTcpListener.EndAcceptTcpClientSocket.AcceptTcpListener.AcceptTcpClient

于 2013-01-01T09:14:20.667 に答える