首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetworkStream类:阅读问题

NetworkStream类:阅读问题
EN

Stack Overflow用户
提问于 2015-06-25 10:11:54
回答 1查看 86关注 0票数 0

我在核心C#./NET中创建了一个服务器客户端程序,在这个程序中,我将数据从一个客户端序列化到另一个服务器,但是当数据非常大时会出现两个异常。有时它可以正常工作,但有时它只是抛出异常。引发IOException或序列化异常。

下面是接收和反序列化数据的代码:

代码语言:javascript
复制
MemoryStream mst = new MemoryStream();
strread.ReadTimeout = 250;

try
{
    int b = strread.Read(outStream, 0, outStream.Length);
    while (b > 0)
    {
        Console.WriteLine("Recieving Data " + b);
        mst.Write(outStream, 0, b);
        try
        {
            b = strread.Read(outStream, 0, outStream.Length);
        }
        catch (IOException ioEx)
        {
            Console.WriteLine(ioEx.TargetSite);
            b = 0;
        }
    }
    Console.WriteLine("Size of recieved bytes is " + b);
}
catch (Exception except)
{
    Console.WriteLine(except.StackTrace + "\r\n" + except.TargetSite);
}

//int bcount = strread.Read(outStream, 0, outStream.Length);

mst.Read(outStream, 0, outStream.Length);
m = (Message)deserialize(outStream);

反序列化方法:

代码语言:javascript
复制
public Message deserialize(byte[] v)
{
    IFormatter formatter = new BinaryFormatter();
    MemoryStream mem = new MemoryStream();
    Message mydat = null;
    try
    {
        mem.Write(v, 0, v.Length);
        mem.Seek(0, 0);
        mydat = (Message)formatter.Deserialize(mem);
    }
    catch (SerializationException ex)
    {
        Console.WriteLine("Salman Deserialization " + ex.Message);
    }
    finally
    {
        mem.Flush();
        mem.Close();
    }

    return mydat;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-04 02:25:18

分析

目前,接收方似乎没有“消息边界”的概念。

接收方使用MemoryStream类的实例累积接收到的数据,直到远程主机关闭连接:while (b > 0)。因此,如果发件人发送多条消息,然后连接被发件人关闭,则接收方完成接收积累,将两个消息存储在MemoryStream类的实例中。在此之后,有人试图将累积的数据解释如下:

代码语言:javascript
复制
mst.Read(outStream, 0, outStream.Length);
m = (Message)deserialize(outStream);

这种解释可能出现的问题:

  • 如果没有完全接收到单个消息怎么办?-反序列化失败。
  • 如果已经收到多条消息怎么办?-反序列化失败。
  • 等。

解决方案

必须引入消息边界概念,以便从网络流(TCP-流)中提取(“单独”)消息。它可以通过使用固定大小的消息头或消息终止符来完成.

请参阅文章:TCP/IP客户端-服务器应用程序:与字符串消息交换

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31047406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档