c# - 如何使用 StreamWriter 发送 byte[]?

标签 c# serialization tcpclient

这是我发送数据的方法:

    // this method serializes an object and is returned as a string (Base64 encoded)
    public void Send(Packet packetData)
    {
        try
        {
            StreamWriter w = new StreamWriter(cli.GetStream());
            string s = SerializeObject(packetData);
            w.WriteLine(s + "\n");
            w.Flush();
        }
        catch (ObjectDisposedException) { ShutdownClient(-2); }
    }
  • cli 是 TcpClient 对象
  • Packet 是一个可序列化的对象

这是我的接收方法:

    private string GetMessage(StreamReader r)
    {
        try
        {
            string s = r.ReadLine();
            s = s.Replace(" ", "");

            // this string is returned and then deserialized
            return s;
        }
        catch (Exception e) { System.Windows.Forms.MessageBox.Show(e.Message); return null; }
    }

当我使用这个时,50% 的时间它都有效。如果不起作用,原因如下: “输入流不是有效的二进制格式。起始内容(以字节为单位)为:6D-2E-44-72-61-77-69-6E-67-2E-43-6F-6C-6F -72-0F-00 ...”

我尝试使用 Encoding.Default.GetString/GetBytes 代替 Base64,但后来我得到了这个: “二进制流“0”不包含有效的 BinaryHeader。可能的原因是序列化和反序列化之间无效的流或对象版本更改。” 如果我打印出这个(默认编码)字符串的长度,它是 183。但是如果我打印出实际的字符串,则不会打印任何内容。

我还能如何通过 StreamWriter 将 byte[] 作为字符串发送?

最佳答案

How else can I send a byte[] as a string

不是你现在这样做的方式,当字符串标准化时,byte[] 内容将被损坏。字符串只能用于存储 Unicode 字符。并非每个 Unicode 代码点都是有效的。

如果使用字符串至关重要,那么您应该在发送端使用 Convert.ToBase64String(),在接收端使用 Convert.FromBase64String()。

请记住,TCP 完全能够传输二进制数据。您可能会陷入这个困境,因为 TCP 实现了,它没有做任何事情来帮助您传输消息。传输二进制“消息”的简单方法是首先写入字节[]的长度。接收方首先读取该长度,然后知道应该将什么传递给 Read() 调用以从 TCP 流恢复 byte[]。

关于c# - 如何使用 StreamWriter 发送 byte[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21905614/

相关文章:

c# - 将 'var' 传递给另一个方法

c# - 为 Access mdb 文件创建 OdbcConnection 的 ConnectionString 是什么

java.io.StreamCorruptedException : invalid stream header: AC3F0005

ruby - 如何在 Ruby 中建立启用 SSL 的 TCP/IP 连接

Java 客户端混合 TCP 和 UDP 功能

C#.NET MDI 在以编程方式隐藏和再次显示最大化的子窗体时出现错误,并且当最大化时,无法更改子窗体的图标

c# - HashSet 上的 LINQ 的 ForEach?

swift - JSONEncoder 的 dateEncodingStrategy 不工作

java - 在实例状态下保存自定义对象数组

c# - TcpClient在tcp流关闭之前不会将数据发送到Logstash