客户端需要同时与服务器建立多个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可以使这样的连接成功?
答案 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
比使用TcpListener
和TcpClient
更快更稳定。我尝试了不同的方法来使用TcpListener
和TcpClient
。首先,我使用TcpListener.AcceptTcpClient
来监听带有和不带TcpListener.Pending
的客户端,但仍然可能忽略了一些客户端连接。第二,我使用了异步方法TcpListener.BeginAcceptTcpClient
和TcpListener.EndAcceptTcpClient
,但仍然没有成功,仍然忽略了一些客户端连接。最后使用Socket.Accept
代替TcpListener.AcceptTcpClient
,前一个几乎没有延迟,并且对客户的反应非常快。