Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不知道为什么tcpClient是';他不为我工作_C#_Sockets_Tcpclient - Fatal编程技术网

C# 不知道为什么tcpClient是';他不为我工作

C# 不知道为什么tcpClient是';他不为我工作,c#,sockets,tcpclient,C#,Sockets,Tcpclient,我试着用telnet检查server:port,得到了预期的结果。因此,无论是writer.Write()还是reader.ReadLine()都无法工作,因为我从服务器上什么也得不到 TcpClient socket = new TcpClient(hostname, port); if (!socket.Connected) { Console.WriteLine("Failed to connect!"); return; } TextReader reader = n

我试着用telnet检查server:port,得到了预期的结果。因此,无论是
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");
编辑:我可能已经发现了问题。此代码基于我在web上找到的示例。我尝试了另一个irc服务器:open.ircnet.net:6669,得到了响应:

:openirc.snt.utwente.nl 020*:我们正在处理您的连接,请稍候。


似乎我可能需要在线程中运行阅读器,以便它可以一直等待响应。然而,当程序在循环中被捕获时,却没有将完成打印到控制台,这似乎很奇怪。

我认为您需要提供进一步的细节。我只是想假设,因为您可以使用相同的端口轻松地远程登录到服务器,所以您的问题在于对
Connected
属性的评估

if (!socket.Connected) {
    Console.WriteLine("Failed to connect!");
    return;
}
这是错误的,因为Microsoft在中明确指定
Connected
属性不可靠

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

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

暗示
  • 删除对连接的
    属性的求值
  • GetStream
    Write
    方法调用包装在try/catch块中,以处理网络通信错误

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

    RFC for ping表示服务器可能不会响应它&这样的连接必须在一段时间后关闭。请检查RFC:

    程序从未提前结束,因为它未“连接”,因此
    connected
    属性始终返回true。而整个过程都被“尝试/抓住”所包裹。即使我进行了评估,但这不会影响我无法阅读tcpclient的内容。尽管如此,我还是尝试了你的建议。没有变化。这是一个irc服务器,所以我希望它在客户端连接时循环。我将
    reader.ReadLine()
    放在一个单独的线程中,仍然没有收到服务器的任何响应。