如题,在网上找了很多资料都不是我的情况!我现在做的SOCKET网络通信,序列化没问题,传送文字也没问题,我传送图片就出现这个问题了(传送文件我还没有测试),为什么啊!超级郁闷,谁来帮帮我!

解决方案 »

  1.   

    Receive数据到一个字节数组,很可能数组长度不够,数据没有接受完整。
      

  2.   

    图片变字节数组后是较大的数据,接受端一次Receive往往只能接收一部分数据,需要循环多次接收。
    一般发送端在字节流起始位置写入数据长度,后面是实际数据。
    下面是一个接受端如何取数据的代码,你要注意是否数据确定接受完整,是否反序列化时ms.Position = 0; Socket clientSock = SkAccept.Accept();//阻塞方式以接收传入的连接 byte[] clientData = new byte[1024 * 1000];
    MemoryStream ms = new MemoryStream();
                        int receivedBytesLen = clientSock.Receive(clientData);
    //数据长度获得
    long effetDataLen = BitConverter.ToInt64(clientData, 0);
    ms.Write(clientData, 8, receivedBytesLen - 8);
    long recLen = receivedBytesLen;//
    while (recLen < (8 + effetDataLen))
    {
    receivedBytesLen = clientSock.Receive(clientData);
    ms.Write(clientData, 0, receivedBytesLen);
    recLen += receivedBytesLen;
    }
    ms.Position = 0;
    BinaryFormatter bf = new BinaryFormatter();
    SockData sockData = (SockData)bf.Deserialize(ms);
    ms.Close();
      

  3.   

    哎....可能我技术有限吧,又出现新的问题了:
    输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-...............
      

  4.   

    Socket clientSock = SkAccept.Accept();//阻塞方式以接收传入的连接                    byte[] clientData = new byte[1024 * 1000];
                        MemoryStream ms = new MemoryStream();
                        int receivedBytesLen = clientSock.Receive(clientData);
                        //数据长度获得
                        long effetDataLen = BitConverter.ToInt64(clientData, 0);
                        ms.Write(clientData, 8, receivedBytesLen - 8);
                        long recLen = receivedBytesLen;//
                        while (recLen < (8 + effetDataLen))
                        {
                            receivedBytesLen = clientSock.Receive(clientData);
                            ms.Write(clientData, 0, receivedBytesLen);
                            recLen += receivedBytesLen;
                        }
                        ms.Position = 0;
                        BinaryFormatter bf = new BinaryFormatter();
                        SockData sockData = (SockData)bf.Deserialize(ms);
                        ms.Close();

      

  5.   

    那要是4.0001M是不是就垮了?传送4K的文件也必须4M缓冲么?
      

  6.   

    另:  TcpClient client;
                bool rV = true;
                try
                {
                    IPAddress ip=new IPAddress(new byte[]{192,168,3,108});
                    client = new TcpClient(); 
                    client.Connect(ip, 8500); // 与服务器连接 
                    NetworkStream streamToServer = client.GetStream();
                                 MemoryStream ms = new MemoryStream();
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(ms, m);
                byte[] buffer  = ms.ToArray();                
    streamToServer.Write(buffer, 0, buffer.Length); //发往服务器
                    client.Close();
                                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }formatter.Serialize(ms, m);中的m是我传送过来的消息对象
      

  7.   

    这个问题我还没注意过,请问如何指定?
    客户端我用:
    streamToServer.DataAvailable来判断数据是否接受完毕!
      

  8.   

    那个属性不行的,在数据量较大时,接受端可能读完了缓冲区数据,发送的数据还没有发过来,此时DataAvailable是0,但实际你仍然需要继续Receive数据。
    发送端必须在头部加入长度。接受端首先读出长度值,然后循环Receive,直到数据长度达到那个值
      

  9.   

    我用的是NetworkStream  可能跟您写的不太一样,是没有Receive这个方法的!我也考虑到了数据量大的时候读完了缓冲区数据,发送的数据还没法完的情况.不知道可不可以给我一个好一点的解决方案??244627758我的QQ能否加我详谈?拜谢!
      

  10.   

    怎么这么多人回复,还没解决呢?
    我也是报出这个错误。
    前天写好了,Client 请求 server 发一张表数据,一切正常(把dataset 序列化和反序列化)。
    今天再测试,偶尔报出 “二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。"
    确定是反序列化的时候 出的问题,数据接收正常。
    查阅msdn,找到一篇微软机器人翻译的文章,看了半天,还是不能解决问题。
      

  11.   


    看我的帖子,同样的操作功能,我的错误类型别你的要多几个啊。有图说明的。
    谢谢。
    http://topic.csdn.net/u/20100805/12/e6ab30cf-1b27-4ec1-9a39-83e8ae6cb6dc.html