我尝试检查服务器:使用telnet端口,我获得了预期的结果。因此,writer.Write()
或reader.ReadLine()
无法正常工作,因为我从服务器中得不到任何结果。
TcpClient socket = new TcpClient(hostname, port);
if (!socket.Connected) {
Console.WriteLine("Failed to connect!");
return;
}
TextReader reader = new StreamReader(socket.GetStream());
TextWriter writer = new StreamWriter(socket.GetStream());
writer.Write("PING");
writer.Flush();
String line = null;
while ((line = reader.ReadLine()) != null) {
Console.WriteLine(line);
}
Console.WriteLine("done");
编辑:我可能已经找到了这个问题。此代码基于我在网络上找到的示例。我尝试了另一个irc服务器:open.ircnet.net:6669我收到了回复:
:openirc.snt.utwente.nl 020 * :Please wait while we process your connection.
似乎我可能需要在线程中运行阅读器,以便它可以不断等待响应。但是,如果程序在while
循环中没有打印done
到控制台,这似乎很奇怪。
答案 0 :(得分:1)
我认为您需要提供更多详细信息。我只是假设因为你可以使用相同的端口轻松telnet到服务器,你的问题在于Connected
属性的评估......
if (!socket.Connected) {
Console.WriteLine("Failed to connect!");
return;
}
这是错误的,因为Microsoft在documentation中明确指出Connected
属性不可靠
由于Connected属性仅反映最近操作时的连接状态,因此您应尝试发送或接收消息以确定当前状态。消息发送失败后,此属性不再返回true。请注意,此行为是设计使然。您无法可靠地测试连接状态,因为在测试和发送/接收之间的时间内,连接可能已丢失。您的代码应该假定套接字已连接,并正常处理失败的传输。
也就是说,您不应该使用此属性来确定连接的状态。不用说,使用此属性来控制控制台应用程序的流程将导致意外结果。
Connected
属性GetStream
和Write
方法调用包装在try / catch块中以处理网络通信错误答案 1 :(得分:0)
reader.ReadLine()
将等待任何数据到达。如果没有数据到达,它似乎挂起了。这是tcp的一个特性(我也不喜欢它)。您需要了解如何定义消息的结尾并根据该结束标准停止。注意,消息标识符的结尾可以分成两行或更多行...
答案 2 :(得分:0)
用于ping的RFC表示服务器可能无法响应它&这种联系必须在一段时间后关闭。请查看RFC:https://tools.ietf.org/html/rfc1459#section-4.6.2