这是我发送数据的方法:
// 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/