Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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不';t连接_C#_Networking_Tcpclient - Fatal编程技术网

C# TcpClient不';t连接

C# TcpClient不';t连接,c#,networking,tcpclient,C#,Networking,Tcpclient,我正在用C#开发一个Tcp客户端,并使用TcpClient类。 我无法连接到服务器 调试应用程序时,我可以看到对Connect的调用已成功,但在完成此操作后,我会使用netstat检查服务器和客户端上的连接状态。结果是连接的服务器已建立,但在客户端上,我无法在netstat result中看到与服务器的任何连接 读取TcpClient实例时,我可以看到属性Connected为true,因此应该没有问题,但当我尝试从NetworkStream读取时,它会挂起 当我说它挂起时,我的意思是服务器正在发

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

调试应用程序时,我可以看到对
Connect
的调用已成功,但在完成此操作后,我会使用
netstat
检查服务器和客户端上的连接状态。结果是连接的服务器
已建立
,但在客户端上,我无法在netstat result中看到与服务器的任何连接

读取
TcpClient
实例时,我可以看到属性
Connected
为true,因此应该没有问题,但当我尝试从
NetworkStream
读取时,它会挂起

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

你知道会有什么问题和解决办法吗


谢谢

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

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

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


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

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

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

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


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

您所看到的是绝对正常的

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.

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

您看到的是绝对正常的

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.

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

在客户端,当您使用netstat时,您正在寻找哪个端口

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


对于networkstream问题,我必须查看代码以确定出了什么问题。

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

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


对于networkstream问题,我必须查看代码以确定出了什么问题。

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

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

在此基础上扩展,发送请求的方式如下:

TcpClient.GetStream().BeginWrite( tcpMessage, ... );
它将发送tcpMessage中的请求,该请求将是由如下字符串生成的ByTestStream:

byte[] tcpMessage = httpEncoding.GetBytes( httpMessage );
httpMessage = "GET / HTTP/1.1\r\n" + ...;
TcpClient.GetStream().BeginRead( ... );
其中包含如下请求消息:

byte[] tcpMessage = httpEncoding.GetBytes( httpMessage );
httpMessage = "GET / HTTP/1.1\r\n" + ...;
TcpClient.GetStream().BeginRead( ... );
它发送您的请求,这会导致服务器生成响应,然后您可以像这样收集响应:

byte[] tcpMessage = httpEncoding.GetBytes( httpMessage );
httpMessage = "GET / HTTP/1.1\r\n" + ...;
TcpClient.GetStream().BeginRead( ... );
你终于可以得到一些回报了!
即使只是一个“我不喜欢你的要求”的回答。8d

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

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

在此基础上扩展,发送请求的方式如下:

TcpClient.GetStream().BeginWrite( tcpMessage, ... );
它将发送tcpMessage中的请求,该请求将是由如下字符串生成的ByTestStream:

byte[] tcpMessage = httpEncoding.GetBytes( httpMessage );
httpMessage = "GET / HTTP/1.1\r\n" + ...;
TcpClient.GetStream().BeginRead( ... );
其中包含如下请求消息:

byte[] tcpMessage = httpEncoding.GetBytes( httpMessage );
httpMessage = "GET / HTTP/1.1\r\n" + ...;
TcpClient.GetStream().BeginRead( ... );
它发送您的请求,这会导致服务器生成响应,然后您可以像这样收集响应:

byte[] tcpMessage = httpEncoding.GetBytes( httpMessage );
httpMessage = "GET / HTTP/1.1\r\n" + ...;
TcpClient.GetStream().BeginRead( ... );
你终于可以得到一些回报了!
即使只是一个“我不喜欢你的要求”的回答。8天

我不清楚。当我说它挂起时,我的意思是服务器正在发送数据,但读线根本没有任何数据。我不清楚。当我说它挂起时,我的意思是服务器正在发送数据,但读线根本没有得到任何数据。不,我忘了提到,当我说读线挂起时,我的意思是服务器正在发送数据,但读线根本没有得到任何数据。你确定服务器正在发送数据吗?大多数web都使用请求/响应模式。您必须在服务器响应之前发送请求。不,我忘了提到,当我说readLine挂起时,我的意思是服务器正在发送数据,但readLine根本没有收到任何数据。您确定服务器正在发送数据吗?大多数web都使用请求/响应模式。您必须在服务器响应之前发送请求。听起来您的建议不错。B