以下是我发送数据的方法:
// 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); }
}
这是我的接收方式:
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将字符串[]作为字符串发送?
答案 0 :(得分:2)
我怎样才能将字节[]作为字符串发送
不是你现在这样做的方式,当字符串规范化时,byte []内容将被破坏。字符串只能用于存储Unicode字符。并非每个Unicode代码点都有效。
如果使用字符串是最重要的,那么你应该在发送器使用Convert.ToBase64String(),在接收端使用Convert.FromBase64String()。
请记住,TCP完全能够传输二进制数据。你可能会陷入这个漏洞,因为TCP实现了流,它没有做任何事情来帮助你传输消息。传输二进制“消息”的简单方法是首先写入byte []的长度。接收器首先读取该长度,然后知道它应该传递给Read()调用以从TCP流中恢复byte []。