【问题标题】:why is this throwing a end of stream encountered before parsing was completed?为什么在解析完成之前会遇到流结束?
【发布时间】:2012-06-20 17:57:17
【问题描述】:

我不确定为什么会在解析完成之前抛出错误 End of stream 。我查看了这个link,但那里没有解决我的问题。我使用断点来找到它抛出错误女巫的确切点是

       Console.WriteLine("Message from client ");

提前致谢

   if (stream.DataAvailable)
   {
       byte[] buffer = new byte[10024];
       int byteCount = stream.Read(buffer, 0, buffer.Length);
       byte[] inBytes = new byte[byteCount];
       for (int counter = 0; counter < byteCount; counter++)
           inBytes[counter] = buffer[counter];
       BinaryFormatter formatter = new BinaryFormatter();
       MemoryStream memory = new MemoryStream();
       memory.Write(inBytes,0,inBytes.Length);
       object message = (object)formatter.Deserialize(memory);
       Console.WriteLine("Message from client ");
       memory.Close();
   }

编辑*这是我的错,这里的实际代码没有任何问题,我在客户端犯了错误。我使用 Encoding.ASCII 而不是 binaryformatter。

【问题讨论】:

    标签: c# stream networkstream


    【解决方案1】:

    好吧,您假设对stream.Read 的一次调用将读取所有数据。这几乎总是一个错误,尤其是当它是网络流时。

    你有什么理由不只是打电话给formatter.Deserialize(stream)吗?

    【讨论】:

    • 这就是我第一次拥有它的方式,将其更改为尝试调试代码,如果我这样做,因为它在一个循环中,它只会一遍又一遍地抛出错误,当它像它一样现在它只被抛出一次。
    • @Shredder2500:循环是什么?您在这里没有真正提供足够的上下文。如果这些是来自客户端的“消息”,您是否有任何类型的消息分隔符,或者您知道长度?只是希望您在单个 Read 呼叫中收到一条消息(并且只有一条消息)是一个非常糟糕的科。
    • 它只是一个永远循环的while循环,尽管它现在不需要。现在我只是发送一个字符串。
    【解决方案2】:

    这是我的错,这里的实际代码没有任何问题,我在客户端犯了错误。我使用 Encoding.ASCII 而不是 binaryformatter。

    【讨论】:

    • 我不同意...代码确实是错误的...您必须在尝试处理之前检查是否有完整帧
    • 好吧,代码本身还没有完成,但问题的重点是导致该错误的原因,该代码中什么都没有。现在我只是在测试以确保它正在获取数据。那里的一些代码只是为了尝试看看它有什么问题。一方面,它只使用格式化程序而不是缓冲区和字节。我现在正在添加支票。
    • @MarcGravell 你如何检查你是否有一个完整的框架,我有同样的问题??
    • @Smith 您需要在协议中定义帧。在文本协议中,可能仅仅是行尾 (cr/lf) 的事实。如果是二进制协议,通常会在日期前面加上一些东西,告诉你下一帧中有多少数据。
    • @MarcGravell 有关如何实现此功能的任何教程、参考或指南?
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多