接受唯一预期客户端后,能否停止并释放TcpListener?
已建立的TCP连接在监听者停止/释放后仍能正常通信,这是预期行为吗?
我在Windows系统上进行了如下测试,客户端似乎仍能正常工作,但我想了解这种行为是有保障的还是偶然现象:
using (var listener = new TcpListener(IPAddress.Loopback, 34346)) { listener.Start(); // client Task.Run(async () => { using var client = new TcpClient(); await client.ConnectAsync(IPAddress.Loopback, 34346); await using var stream = client.GetStream(); await Task.Delay(TimeSpan.FromSeconds(30)); stream.WriteByte(42); }); using var client = await listener.AcceptTcpClientAsync(); listener.Stop(); listener.Dispose(); log.LogInformation("Disposed listener"); await using var stream = client.GetStream(); log.LogInformation("{Byte}", stream.ReadByte()); }
输出结果:
Disposed listener 42
这种行为是有保障的预期行为,并非偶然现象。
TCPListener的核心职责是监听指定端口、处理新的连接请求。当AcceptTcpClientAsync成功返回时,客户端和服务端之间的TCP连接已经完全建立。此时停止或释放TCPListener,只会让它无法再接受后续的新连接,对已经建立好的连接没有任何影响。
已建立的TCP连接的生命周期和监听者是相互独立的——只要连接两端的TcpClient实例(底层对应Socket)没有被关闭,就能正常收发数据。你代码里服务端拿到的client实例就是这个已建立连接的直接代表,监听者的销毁不会干扰它的正常工作。
内容的提问来源于stack exchange,提问作者LOST
相关产品推荐
相关产品推荐

