不知道为什么tcpClient不适合我

时间:2014-07-11 02:10:50

标签: c# sockets tcpclient

我尝试检查服务器:使用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到控制台,这似乎很奇怪。

3 个答案:

答案 0 :(得分:1)

我认为您需要提供更多详细信息。我只是假设因为你可以使用相同的端口轻松telnet到服务器,你的问题在于Connected属性的评估......

if (!socket.Connected) {
    Console.WriteLine("Failed to connect!");
    return;
}

这是错误的,因为Microsoft在documentation中明确指出Connected属性不可靠

  

由于Connected属性仅反映最近操作时的连接状态,因此您应尝试发送或接收消息以确定当前状态。消息发送失败后,此属性不再返回true。请注意,此行为是设计使然。您无法可靠地测试连接状态,因为在测试和发送/接收之间的时间内,连接可能已丢失。您的代码应该假定套接字已连接,并正常处理失败的传输。

也就是说,您不应该使用此属性来确定连接的状态。不用说,使用此属性来控制控制台应用程序的流程将导致意外结果。

建议

  1. 删除对Connected属性
  2. 的评估
  3. 将您的GetStreamWrite方法调用包装在try / catch块中以处理网络通信错误

答案 1 :(得分:0)

reader.ReadLine()将等待任何数据到达。如果没有数据到达,它似乎挂起了。这是tcp的一个特性(我也不喜欢它)。您需要了解如何定义消息的结尾并根据该结束标准停止。注意,消息标识符的结尾可以分成两行或更多行...

答案 2 :(得分:0)

用于ping的RFC表示服务器可能无法响应它&这种联系必须在一段时间后关闭。请查看RFC:https://tools.ietf.org/html/rfc1459#section-4.6.2