如何使用TcpListener处理长TCP连接

时间:2019-10-29 09:16:57

标签: c# tcpclient tcplistener

  1. 我想使用长Tcp连接,而不是短时存活。
  2. 我需要知道什么时候断开连接,甚至拔掉网络电缆(几秒钟/分钟也可以接受)

我尝试遵循代码


 _tcpListener = new TcpListener(endPoint);
            _tcpListener.Start();
            _ = Task.Factory.StartNew(async () =>
              {
                  while (true)
                  {
                      try
                      {
                          var buffer = new Memory<byte>(new byte[1024 * 10]);// 10KB buffer
                          var result = 0;
                          var client = await _tcpListener.AcceptTcpClientAsync();

                          using (var stream = client.GetStream())
                          {
                              result = await stream.ReadAsync(buffer);
                              this.HandleMessage(buffer.Slice(0, result));
                          }
                      }
                      catch (SocketException e)
                      {
                          NLog.LogManager.GetCurrentClassLogger().Info(e);
                          HandleMessage(new Memory<byte>(Encoding.UTF8.GetBytes("rtsp://shutdown$")));
                      }
                      catch (Exception e)
                      {
                          NLog.LogManager.GetCurrentClassLogger().Info(e);
                      }
                  }
              }, TaskCreationOptions.LongRunning);

但是似乎tcp连接不是很长,因此无法检测到连接丢失。

我还尝试在GetStream()之后执行另一个循环,但是在第一次读取(结束)之后它无法读取任何数据。

有人可以帮助我吗?为什么它看起来与WebSocket如此不同,即使关闭客户端设备,我也无法使其具有任何SocketException。

1 个答案:

答案 0 :(得分:0)

如果我理解的正确,那么您需要:

  1. 要使Tcp连接寿命长,您可以使用_tcpListener.Start()代替_tcpListener.Start(Int32),再使用here

  2. 要检查您的连接是否有效,可以使用_tcpListener.Active属性

  

如果TcpListener正在积极侦听,则为true;否则为false。否则为假。