【问题标题】:TcpClient doesn't connectTcpClient 无法连接
【发布时间】:2010-06-24 13:17:39
【问题描述】:

我正在用 C# 开发一个 Tcp 客户端,我正在使用 TcpClient 类。 我无法连接到服务器。

调试应用程序我可以看到对Connect 的调用是成功的,但是在我这样做之后,我用netstat 检查服务器和客户端上的连接状态。结果是服务器的连接是ESTABLISHED,但是在客户端我在netstat结果中看不到任何与服务器的连接。

读取TcpClient 实例我可以看到属性Connected 是真的,所以应该没问题,但是当我尝试从NetworkStream 读取时它挂起。

当我说它挂起时,我的意思是服务器正在发送数据,但 readline 根本没有得到任何数据。

您知道可能是什么问题以及一些解决方法吗?

谢谢

【问题讨论】:

  • 我正在连接到在 Solaris 上运行的服务器应用程序。中间没有防火墙。

标签: c# networking tcpclient


【解决方案1】:

首先,一个建议:根据我的经验,TcpClient 最好异步使用。

在我所有使用 TcpClient 的过程中,如果不先对请求进行写入,我就无法读取响应。您将永远阻止尝试同步等待对您尚未发送的请求的响应。

在此基础上,发送请求将像这样完成:

TcpClient.GetStream().BeginWrite( tcpMessage, ... );

它将发送 tcpMessage 中的请求,该请求将是由这样的字符串生成的字节流:

byte[] tcpMessage = httpEncoding.GetBytes( httpMessage );

你的请求信息是这样的:

httpMessage = "GET / HTTP/1.1\r\n" + ...;

这会发送您的请求,这会导致服务器生成响应,然后您可以像这样收集该响应:

TcpClient.GetStream().BeginRead( ... );

你应该终于可以收到回馈了! 哪怕只是一句“我不喜欢你的要求!”回复。 8天

【讨论】:

  • 您的建议看起来不错。基本上我的客户只听服务器。当我说 ReadLine 挂起时,我的意思是你在说什么:服务器正在发送数据,但我一直在等待。还有一个问题:当您说“使用请求编写”时,就请求的代码而言,您究竟是什么意思?你是说 NetworkStream.Write()..like 某种心跳?
  • 好了,答案扩展了。这不是心跳信号,而是您的 TCP 请求消息。在我的示例中,它是一个 HTTP GET。希望能为您解决问题。
【解决方案2】:

你看到的完全正常。

Reading the TcpClient instance I can see that the property Connected is true so it should be fine but when I try to read from the NetworkStream it hangs.

当您尝试读取时,线程将被阻塞,直到服务器向您发送一些数据。否则,根据您使用的读取方法,它可以永远被阻止。

【讨论】:

  • 我不清楚。当我说它挂起时,我的意思是服务器正在发送数据,但 readline 根本没有得到任何数据。
【解决方案3】:

这取决于服务器,但大多数 TCP 服务器会在客户端发送响应之前等待客户端发送请求。听起来您的线程正在等待数据。你设置了读取超时吗?

确保您发送请求,以便服务器知道向您发送响应。

通常,您会将 TcpClient 放入单独的线程并使用读取超时来避免挂起整个程序等待响应。

确保在与阻塞(同步)服务器通信时不使用非阻塞(异步)套接字,您只会遇到问题。阻塞套接字对于 Web 来说是正常的,因为大多数 Web 服务都使用请求/响应范例。

【讨论】:

  • 不,我忘了提到,当我说 readLine 挂起时,我的意思是服务器正在发送数据,但 readline 根本没有收到任何数据。
  • 您确定服务器正在发送数据吗?大多数网络都使用请求/响应范例。您必须在服务器响应之前发送请求。
【解决方案4】:

在客户端,您在进行 netstat 时正在寻找什么端口?

因为当客户端建立连接时,它会使用临时端口。这意味着它将使用任何高于已知端口号最大值的空闲端口。因此,您的客户端可能使用与您预期不同的端口号。

对于网络流问题,我必须查看代码才能确定出了什么问题。

【讨论】:

    猜你喜欢
    • 2015-08-16
    • 2012-11-12
    • 1970-01-01
    • 2017-08-17
    • 2016-04-08
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多