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);
}

第一次连接成功。但是由于服务器没有响应(实际上服务器正在侦听 tcp 连接),第二次连接失败。
但是,如果我Thread.Sleep(1500)在每个 tcp.Connect() 之后添加,所有连接都是成功的。但是这种情况只有在有一个客户端和一个服务器的情况下才成立。如果有很多客户端,那么如何确保服务器可以接受每个连接?还有为什么我添加 Thread.Sleep 可以使这样的连接成功?

4

2 回答 2

0

由于仍然没有满意的答案,我最终使用不同的方法来处理我的案件。我发现使用 classSocket比使用TcpListenerand更快更稳定TcpClient。我尝试了不同的方法来使用TcpListenerTcpClient. 首先,我曾经TcpListener.AcceptTcpClient在有和没有的情况下监听客户端,TcpListener.Pending但仍然可能忽略一些客户端连接。其次,我使用了异步方法,TcpListener.BeginAcceptTcpClientTcpListener.EndAcceptTcpClient仍然没有成功,仍然忽略了一些客户端连接。最后使用Socket.Accept代替TcpListener.AcceptTcpClient,前者几乎没有延迟,并且对客户的响应速度非常快。

于 2013-01-01T09:14:20.667 回答
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 回答