连接到TCP服务器时,无法得到响应

本文关键字:响应 TCP 服务器 连接 | 更新日期: 2023-09-27 17:51:26

我有一个成功连接到外部服务器的TCP客户端,并且我正在向成功接收的服务器发送请求。

然而,当我尝试接收响应时,它只是停滞并且从未接收到它。

var message = "Hello World!";
var port = 9999; //Changed for question
var ip = "100.100.100.100"; //Changed for question
var tcpclnt = new TcpClient();
Console.WriteLine("Connecting.....");
await tcpclnt.ConnectAsync(ip, port);
Console.WriteLine("Connected");
Stream stm = tcpclnt.GetStream();
byte[] ba = Encoding.ASCII.GetBytes(message);
Console.WriteLine("Transmitting {0}", message);
await stm.WriteAsync(ba, 0, ba.Length);
byte[] bb = new byte[100];
var bytesRecieved = await stm.ReadAsync(bb, 0, 100);
var response = new StringBuilder();
foreach (byte t in bb)
      response.Append(Convert.ToChar(t));
Console.WriteLine("Received {0}", response);
tcpclnt.Close();

我的计算机和路由器上都打开了正确的端口。

连接到TCP服务器时,无法得到响应

你的代码有很多问题,但其中一个最大的问题是对方无法知道你什么时候完成了传输。

TCP是基于流的协议,而不是基于消息的协议。这意味着在一端发送和另一端读取之间没有1:1的映射。这就像写入和读取文件流,而不像发送电子邮件。

这意味着,除非您实际处理流数据,否则您将需要一些方法来区分流中的消息。例如,通过将'r'n添加到每个字符串中-但这是客户端和服务器必须达成一致的事情。如果需要更具体的帮助,还必须显示服务器代码。

其他错误:

  • 你不能忽略ReadAsync的返回值——它告诉你实际读取了多少数据。
  • 你不能只是对编码问题置之不理——双方都必须明确地使用(商定的)编码进行读写。在您的情况下,这意味着使用Encoding.ASCII.GetString而不是Convert.ToChar
  • 与第一点相关,您不能只调用ReadAsync一次并期望获得整个消息(甚至期望获得恰好一条消息)。对于任何实际情况,您都需要一个循环,只要有数据就读取数据。
  • 不处理正常关机。如果你只做http风格的"请求->响应",这并不重要,但否则就会有问题。