我正在尝试创建一个小型 IRC 服务器来学习一些新的编程概念(以及我永远不会使用的其他概念)。第一步是让一个基本的客户端通过 TCP 连接以向服务器发送明文命令。
要收听连接,我有以下代码:
public NetworkClient(Server server, TcpClient socket, int id)
{
_socket = socket;
_id = id;
_server = server;
}
private async void ListenForClients()
{
int numClients = 0;
while (IsRunning)
{
var tcpClient = await _listener.AcceptTcpClientAsync();
var netClient = new NetworkClient(this, tcpClient, numClients);
netClient.Start();
Console.WriteLine("Client Connected");
numClients++;
}
}
然后在我的NetworkClient
课堂上,我的Start()
方法如下所示:
public async void Start()
{
using (var reader = new StreamReader(_socket.GetStream()))
{
while (_server.IsRunning)
{
var line = await reader.ReadLineAsync();
Console.WriteLine("Client {0} wrote: {1}", _id, line);
}
}
}
这在连接 telnet 客户端时效果很好,但是一旦我关闭我的 telnet 客户端就会reader.ReadLineAsync();
不断返回null
。我会添加一个检查以查看是否,line == null
但我不确定这是检测客户端是否已断开连接的正确方法。
更糟糕的_socket.Connected
是,当空值被reader.ReadLineAsync()
.
检测 tcp 客户端何时断开连接的正确方法是什么?