我正在用C#开发一个Tcp客户端,并且我正在使用TcpClient类。我无法连接到服务器。
调试应用程序时,我可以看到对Connect的调用是成功的,但在执行此操作后,我使用netstat检查服务器和客户端上的连接状态。结果是服务器的连接是ESTABLISHED的,但是在客户端,我在netstat结果中看不到任何到服务器的连接。
读取TcpClient实例时,我可以看到属性Connected为真,所以它应该没问题,但是当我尝试从NetworkStream读取时,它挂起了。
当我说它挂起时,我的意思是服务器正在发送数据,但是readline根本得不到任何数据。
您知道什么可能是问题和一些解决方法吗?
谢谢
发布于 2010-06-24 22:00:23
首先,我有一个建议:根据我的经验,最好异步使用TcpClient。
在我使用TcpClient的所有过程中,我从来没有在不先对请求执行写操作的情况下读取响应。您将永远阻止尝试同步等待对您尚未发送的请求的响应。
在此基础上,发送请求将如下所示:
TcpClient.GetStream().BeginWrite( tcpMessage, ... );它将发送tcpMessage格式的请求,该请求将是从如下字符串生成的字节流:
byte[] tcpMessage = httpEncoding.GetBytes( httpMessage );其中包含如下的请求消息:
httpMessage = "GET / HTTP/1.1\r\n" + ...;这将发送您的请求,这会导致服务器生成一个响应,然后您可以像这样收集该响应:
TcpClient.GetStream().BeginRead( ... );你最终应该能够得到一些回报了!即使只是一句“我不喜欢你的请求!”回应。8维
发布于 2010-06-24 21:27:06
这取决于服务器,但大多数TCP服务器都会等待客户端发送请求,然后才会发送响应。听起来你的线程正在等待数据。您是否设置了读取超时时间?
确保您发送请求,以便服务器知道要向您发送响应。
通常,您会将TcpClient放入一个单独的线程中,并使用读取超时来避免挂起整个程序等待响应。
确保在与阻塞(同步)服务器通信时不使用非阻塞(异步)套接字,否则只会遇到问题。阻塞套接字对于web来说是正常的,因为大多数web服务都使用请求/响应范例。
发布于 2010-06-24 21:44:25
你所看到的绝对是正常的。
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.当您尝试读取时,线程将被阻塞,直到服务器向您发送一些数据。否则,基于您使用的读取方法,它可能会被永久阻止。
https://stackoverflow.com/questions/3110255
复制相似问题