Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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# 令人沮丧的TCP序列化异常:二进制流';0';不包含有效的BinaryHeader_C#_Sockets_Serialization_Tcp - Fatal编程技术网

C# 令人沮丧的TCP序列化异常:二进制流';0';不包含有效的BinaryHeader

C# 令人沮丧的TCP序列化异常:二进制流';0';不包含有效的BinaryHeader,c#,sockets,serialization,tcp,C#,Sockets,Serialization,Tcp,我在上发布了一个问题,看起来主要问题已经解决了,但现在我经常遇到另一个例外: 二进制流“0”不包含 有效的二进制标头。可能原因 流或对象版本无效 在序列化和 反序列化 问题仍在我的接收方法中: public Message Receive() { if (_tcpClient == null || !_tcpClient.Connected) { throw new TransportException("Client Not Connected&quo

我在上发布了一个问题,看起来主要问题已经解决了,但现在我经常遇到另一个例外:

二进制流“0”不包含 有效的二进制标头。可能原因 流或对象版本无效 在序列化和 反序列化

问题仍在我的接收方法中:

public Message Receive()
{
    if (_tcpClient == null || !_tcpClient.Connected)
    {
        throw new TransportException("Client Not Connected");
    }

    // buffers
    byte[] msgBuffer;
    byte[] sizeBuffer = new byte[sizeof(int)];

    // bites read
    int readSize = 0;
    // message size
    int size = 0;

    MemoryStream memStream = new MemoryStream();
    NetworkStream netStream = _tcpClient.GetStream();
    BinaryFormatter formatter = new BinaryFormatter();
    try
    {
        // Read the message length
        netStream.Read(sizeBuffer, 0, sizeof(int));

        // Extract the message length
        size = BitConverter.ToInt32(sizeBuffer, 0);
        msgBuffer = new byte[size];

        // Fill up the message msgBuffer
        do
        {
            // Clear the buffer
            Array.Clear(msgBuffer, 0, size);

            // Read the message
            readSize += netStream.Read(msgBuffer, 0, _tcpClient.ReceiveBufferSize);

            // Write the msgBuffer to the memory streamvb
            memStream.Write(msgBuffer, 0, readSize);

        } while (readSize < size);

        // Reset the memory stream position
        memStream.Position = 0;

        // Deserialize the message
        return (Message)formatter.Deserialize(memStream); // <-- Exception here

    }
    catch (System.Exception e)
    {
        if (_tcpClient == null || !_tcpClient.Connected)
        {
            throw new TransportException("Client Not Connected");
        }
        else
        {
            throw e;
        }
    }
}
公共消息接收()
{
如果(_tcpClient==null | |!_tcpClient.Connected)
{
抛出新的TransportException(“客户端未连接”);
}
//缓冲区
字节[]msgBuffer;
字节[]sizeBuffer=新字节[sizeof(int)];
//咬读
int readSize=0;
//消息大小
int size=0;
MemoryStream memStream=新的MemoryStream();
NetworkStream netStream=\u tcpClient.GetStream();
BinaryFormatter formatter=新的BinaryFormatter();
尝试
{
//阅读信息长度
Read(sizeBuffer,0,sizeof(int));
//提取消息长度
size=BitConverter.ToInt32(sizeBuffer,0);
msgBuffer=新字节[大小];
//填写消息msgBuffer
做
{
//清除缓冲区
Array.Clear(msgBuffer,0,大小);
//读留言
readSize+=netStream.Read(msgBuffer,0,_tcpClient.ReceiveBufferSize);
//将msgBuffer写入内存流VB
Write(msgBuffer,0,readSize);
}而(readSizereturn(Message)formatter.Deserialize(memStream);//我建议您稍微简化一下代码:

public Message Receive()
{
    try
    {
        if (_tcpClient == null || !_tcpClient.Connected)
        {
            throw new TransportException("Client Not Connected");
        }

        using (var stream = _tcpClient.GetStream())
        using (var reader = new BinaryReader(stream))
        {
            int size = reader.ReadInt32();
            byte[] buffer = reader.ReadBytes(size);
            using (var memStream = new MemoryStream(buffer))
            {
                var formatter = new BinaryFormatter();
                return (Message)formatter.Deserialize(memStream);
            }
        }
    }
    catch (System.Exception e)
    {
        if (_tcpClient == null || !_tcpClient.Connected)
        {
            throw new TransportException("Client Not Connected");
        }
        throw e;
    }
}

此外,如果你是为了好玩和/或教育目的而这样做的,那就没问题,但是在一个真实的项目中,你应该考虑WCF以便通过有线传输对象。

WCF在客户端服务器上不是很好。第二轮询双工是很原始的技术。

@ Darine,MeSi!:)工作很有魅力!我可以帮忙,但是你没有照顾好你。“还是老字帖了吗?”汉斯,我感谢你的帮助(以及你对另一个字帖的关心):),但达林已经为我提供了解决方案。我只是总是确保在接受回答之前给我合理的时间。