C# 如何使用StreamWriter发送字节[]?
以下是我发送数据的方法:C# 如何使用StreamWriter发送字节[]?,c#,serialization,tcpclient,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
// 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将字节[]作为字符串发送
我还可以如何将字节[]作为字符串发送
当字符串被规范化时,byte[]内容将被损坏,而不是像现在这样做。字符串只能用于存储Unicode字符。并非每个Unicode代码点都有效
如果使用字符串至关重要,则应在发送器处使用Convert.ToBase64String(),在接收端使用Convert.FromBase64String()
请记住,TCP完全能够传输二进制数据。您可能会陷入这个困境,因为TCP实现了一个流,它不做任何事情来帮助您传输消息。传输二进制“消息”的简单方法是首先写入字节[]的长度。接收器首先读取该长度,然后知道它应该传递给read()调用什么来从TCP流恢复字节[]。使用
streamWriter.BaseStream.Write
-方法您是否尝试在两端使用特定的编码?例如UTF8或ASCII?还有,为什么要在getter时从流中删除字符?另外,由于写入线已将\n
附加到流中,因此不需要\n
it@thefiloe很有效,谢谢。但现在我遇到了另一个错误“无法从传输连接读取数据:非阻塞套接字操作无法立即完成”,但我很确定这是我的无用设置出现的问题。再次感谢。谢谢你的解释。我确实是这样做的,但有时读取的数据量比应该的少2或3个字节,为什么会发生这种情况?当你计算每个字节时,你不能读取“更少”。忽略Read()的返回值是一个标准错误。Sent 180 | Read 180 | Sent 1920 | Read 1917程序在此失败显然这是代码中的错误,您应该再次调用Read(),因为您没有获得足够的字节。当然,听起来您并不像我建议的那样发送字节[]的长度。我发送了一个大小为4的字节数组。我使用BitConverter.GetBytes将消息数组的长度转换为字节,将其存储在大小数组中,然后发送。然后,消息字节数组直接在后面。