异步/ TCP侦听器-在多个线程中运行

时间:2018-11-07 14:35:38

标签: .net tcplistener

是网络/套接字连接的新手。阅读了很多文章和stackoverflow问题之后。我想出了不同的方法,并最终确定将下面的高级代码用于我的Asynch TCP侦听器

public class DeviceListener
{
    private TcpListener listener = null;

    public DeviceListener(Ip,PortNo)
    {
        listener = new TcpListener(Ip,PortNo);
    }

    public void StartListener()
    {
        listener.Start();
        //TODO: Log listening started here
        WaitForClients();
    }

    private void WaitForClients()
    {
        listener.BeginAcceptTcpClient(OnClientConnected, null);
    }

    private void OnClientConnected(IAsyncResult asyncResult)
    {
        WaitForClients();
        TcpClient client = listener.EndAcceptTcpClient(asyncResult);

        if(client != null)
        {
            //TODO: Log connected
            HandleClientRequest(client);
        }
    }

    private void HandleClientRequest(TcpClient client)
    {
        //Code to process client request
        //Dispose Client
    }
}

根据我的要求,我需要2-3个侦听器。因此,请使用相同的IP地址和不同的端口创建一个新的侦听器实例,这将作为上述方法的输入。(假设我在端口 5000 和xxx中使用Ipxxx.xx.xx.xx。端口 5001 中的xx.xx.xx)

在同一网络中设置的

我的第三方客户端(第一个客户端侦听端口5000和第二个客户端侦听端口5001)作为客户端,他们每秒发送一次 KeepAlive消息 500ms

超时

HanleClientRequestMethod高级

            byte[] buffer = new byte[1024];
                    string data = null;
                    using (NetworkStream stream = client.GetStream())
                    {


                  int bytesRead;
                            // Loop to receive all the data sent by the client.
                            while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                // Translate data bytes to a ASCII string.
                                data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
        if ()//check length
                                {
                                    byte[] byteData = Encoding.ASCII.GetBytes(data);
                                    stream.WriteAsync(byteData, 0, byteData.Length);
                                }
//other logic to receive data fast enough and happend in same millisecond
              }
    }client.Close();

一切都很好,“保持活动”消息也很好,除了少数情况下,我注意到客户说超时并且正在寻找可能发生这种情况的原因

从我的日志中发现

  • 如果两个同步消息在同一毫秒(运行Asynch)收到并在同一毫秒也得到确认。客户端超时,但是根据我的日志,我看到两个线程在同一毫秒被接收和确认

    • 在某些情况下,我注意到收到了第一个客户端请求,收到了第二个客户端请求,并且发送了第二个响应,然后发送了第一个响应,这意味着应用程序发送的保持活动消息不同步,因为它们是异步的。

但是所有其他时间一切都很好,并且这些情况也是随机发生的。为什么发生上述情况?为什么在应用程序按时发送消息后500ms内延迟接收消息

请分享您的见解

0 个答案:

没有答案