如何使用StreamWriter发送byte []?

时间:2014-02-20 10:56:39

标签: 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对象
  • 数据包是可序列化的对象

这是我的接收方式:

    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将字符串[]作为字符串发送?

1 个答案:

答案 0 :(得分:2)

  

我怎样才能将字节[]作为字符串发送

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

如果使用字符串是最重要的,那么你应该在发送器使用Convert.ToBase64String(),在接收端使用Convert.FromBase64String()。

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