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

本文关键字:服务器 连接 客户端 Tcpclient | 更新日期: 2023-09-27 17:50:00

客户端需要同时与服务器建立多个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),则所有连接都成功。但是这种情况只有在有一个客户端和一个服务器的情况下才成立。如果有许多客户端,那么我如何确保每个连接都可以被服务器接受?也是为什么我添加线程。睡眠能使这种联系成功吗?

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

我也有同样的任务。我为。net寻找了这个任务的规范实现,但没有成功。下面描述了我现在使用的方法。

<<p> 主要思想/strong>

我们需要侦听器接收连接,将连接提供给处理程序,并尽快开始侦听新连接。

实施

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

我仍然不是很有信心调用_listener。BeginAcceptTcpClient在ConnectionHandler,但我还没有找到替代方法。

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