Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用StreamWriter发送字节[]?_C#_Serialization_Tcpclient - Fatal编程技术网

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将消息数组的长度转换为字节,将其存储在大小数组中,然后发送。然后,消息字节数组直接在后面。