如何使用TcpListener处理长tcp连接


  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. 对于长寿命Tcp连接,您可以使用_tcpListener.Start()而不是_tcpListener.Start(Int32)更多信息,请点击

  2. 要检查您的连接是否处于活动状态,您可以使用_tcpListener.Active属性

true(如果TcpListener正在主动侦听(;否则为false。

最新更新