TcpClient无法连接

时间:2010-06-24 13:17:39

标签: c# networking tcpclient

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

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

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

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

您知道可能出现的问题和一些解决方法吗?

由于

4 个答案:

答案 0 :(得分:2)

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

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

扩展,发送请求将如下所示:

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

哪个会发送tcpMessage中的请求,这个字节流是从这样的字符串生成的字节流:

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

您的请求消息如下:

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

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

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

你终于可以收到回复的东西! 即使它只是“我不喜欢你的要求!”响应。 8 D

答案 1 :(得分:1)

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

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

通常情况下,您可以将TcpClient放入一个单独的线程中,并使用读取超时时间以避免挂起整个程序等待响应。

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

答案 2 :(得分:1)

你看到的是绝对正常的。

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.

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

答案 3 :(得分:0)

在客户端,当你使用netstat时,你在寻找什么端口?

因为当客户端建立连接时,它会使用临时端口。这意味着它将使用任何自由端口#高于众所周知的端口号的最大值。因此,您的客户端可能使用不同的端口#而不是您期望的端口。

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