Tcpclient多个客户端连接到服务器

时间:2012-12-29 07:10:24

标签: c# tcp tcpclient tcplistener

客户端需要同时与服务器建立多个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连接) 但是,如果我在每个tcp.Connect()之后添加Thread.Sleep(1500),则所有连接都成功。但是,如果有一个客户端和一个服务器,这种情况才会出现。如果有许多客户端,那么我如何确保服务器可以接受的每个连接?为什么我添加Thread.Sleep可以使这样的连接成功?

2 个答案:

答案 0 :(得分: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,但我还没有找到替代方法。

答案 1 :(得分:0)

由于仍然没有满意的答案,我最终使用不同的方法来处理我的情况。我发现使用课程Socket比使用TcpListenerTcpClient更快更稳定。我尝试了不同的方法来使用TcpListenerTcpClient。首先,我使用TcpListener.AcceptTcpClient来监听带有和不带TcpListener.Pending的客户端,但仍然可能忽略了一些客户端连接。第二,我使用了异步方法TcpListener.BeginAcceptTcpClientTcpListener.EndAcceptTcpClient,但仍然没有成功,仍然忽略了一些客户端连接。最后使用Socket.Accept代替TcpListener.AcceptTcpClient,前一个几乎没有延迟,并且对客户的反应非常快。