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)
,则所有连接都成功。但是这种情况只有在有一个客户端和一个服务器的情况下才成立。如果有许多客户端,那么我如何确保每个连接都可以被服务器接受?也是为什么我添加线程。睡眠能使这种联系成功吗?
我也有同样的任务。我为。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
类比使用TcpListener
和TcpClient
类更快,更稳定。我尝试了不同的方法来使用TcpListener
和TcpClient
。首先,我使用TcpListener.AcceptTcpClient
来监听有和没有TcpListener.Pending
的客户端,但仍然可能忽略一些客户端连接。其次,我使用异步方法,TcpListener.BeginAcceptTcpClient
和TcpListener.EndAcceptTcpClient
,但仍然没有成功,仍然忽略一些客户端连接。最后使用Socket.Accept
代替TcpListener.AcceptTcpClient
,前者几乎没有延迟,并且对客户端的响应速度非常快。