【问题标题】:C# binarywriter start and end of stringC# binarywriter 字符串的开始和结束
【发布时间】:2023-03-28 02:53:01
【问题描述】:

我正在通过 TCP 套接字连接发送一个大字符串 0.443+0.064+-0.120+-0.886+0.15167+-0.26754+0.95153

我收到的消息与我发送的字符串不相似。它是在随机点切割的,即43+0.064+-0.120+-0.886+0.15167+-0.26754+0

如何确保读取完整的字符串?

这是客户端代码:

public static void SendMessage(string message)
{
   if (socketConnection == null)
      {
        return;
      }
   using (BinaryWriter writer = new
   BinaryWriter(socketConnection.GetStream(), Encoding.ASCII, true))
      {
         writer.Flush();
         writer.Write(message);
         writer.Flush();
       }
}

这是我的服务器代码:

private void ListenForIncommingRequests()
{
     tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8080);
     tcpListener.Start();
     connectedTcpClient = tcpListener.AcceptTcpClient();

     using (BinaryReader reader = new 
     BinaryReader(connectedTcpClient.GetStream()))
     {                   
         while (true)
          {
            string clientMessage = reader.ReadString();
          }
     }
}

【问题讨论】:

  • 整个字符串是“0.443+0.064+-0.120+-0.886+0.15167+-0.26754+0.95153”吗?因为如果是这样,它不是很大。但如果它更大,它可能是一个碎片问题。尝试在while (true) 范围之外声明您的string clientMessage,并像这样添加到字符串中:clientMessage += reader.ReadString();
  • 你为什么使用8080端口?这通常由 http 服务器使用。
  • @MindSwipe BinaryReader 和 BinaryWriter 使用一种格式,其中字符串前面有一个包含字符串长度的前缀。所以,不能有任何碎片。
  • 您在写入 (ASCII) 和读取 (UTF-8) 时使用了不同的编码,这可能会导致较长的字符串出现问题。您是否尝试过在两个地方使用相同的编码?
  • 请提供完整的minimal reproducible example,可以用来复现效果。

标签: c# sockets tcp binaryreader binarywriter


【解决方案1】:

正如@NineBerry 在 cmets 中指出的那样,您正在编写 ASCII 编码字节,但读取默认 (Unicode (UTF-16)) 编码字节。确保在两端使用相同的编码,我建议使用 Unicode,因此在实例化 BinaryWriter 时删除 Encoding.ASCII 或在实例化 BinaryWriter 和 BinaryReader 时使用 Encoding.Unicode

【讨论】:

  • 我认为您最初的意思是 UTF-8 而不是 UTF-16。而且,对于文件和流,UTF-8 将是更常见的选择。
猜你喜欢
  • 2018-11-14
  • 2015-06-13
  • 2018-04-20
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多