簡體   English   中英

NetworkStream類:讀取問題

[英]NetworkStream class: Read Issue

我正在核心C#。/ NET中制作一個Server客戶端程序,在該程序中,我將從一個客戶端序列化的數據發送到服務器,但是當數據非常大時會發生兩種異常。 有時它工作正常,但有時它會引發異常。 引發IOException或序列化異常。

這是接收和反序列化數據的代碼:

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);

反序列化方法:

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;
}

分析

目前看來,接收方沒有“消息邊界”的概念。

Receiver使用MemoryStream類的實例累積接收到的數據,直到遠程主機關閉連接: while (b > 0) 因此,如果發件人發送了多個消息,然后發件人關閉了連接,則接收方將完成接收累積,將兩條消息都存儲在MemoryStream類的實例中。 之后,嘗試如下解釋累積的數據:

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

此類解釋可能存在的問題:

  • 如果未完全收到單個消息怎么辦? —無法反序列化。
  • 如果收到多條消息怎么辦? —無法反序列化。
  • 等等

必須引入消息邊界概念以從網絡流(TCP流)中提取(“分離”)消息。 可以通過使用固定大小的消息頭或消息終止符來完成。

請參閱文章: TCP / IP客戶端-服務器應用程序:與字符串消息交換

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM