Socket 数据接收不完整解决办法

 List<byte> buffer = new List<byte>();//接收缓存
            if (socket.Connected)
            {
                while (true)
                {
                    try
                    {
                        int rev_length = 0;//接收长度
                        byte[] rev_bytes = new byte[1024 * 1024];   //设置接收的大小 
                        rev_length = this.socket.Receive(rev_bytes);//接收

                        using (MemoryStream ms = new MemoryStream(rev_bytes))
                        {
                            using (BinaryReader br = new BinaryReader(ms))
                            {

                                buffer.AddRange(br.ReadBytes(rev_length));//得到有用数组
                            }
                        }

                        if (buffer.Count > 0)
                        {

                            using (MemoryStream ms = new MemoryStream(buffer.ToArray()))
                            {
                                using (BinaryReader br = new BinaryReader(ms))
                                {
                                    //判断是否是正确的数据包,不符合清除缓存
                                    if (buffer[0] != 0xFF && buffer[1] != 0xFF && buffer[2] != 0xFF)
                                    {
                                        buffer.Clear();
                                    }
                                    else
                                    {
                                        //获取头部
                                        byte[] heads = br.ReadBytes(3);
                                        int len = br.ReadInt32();
                                        //获取数据包长度
                                        if (buffer.Count < len + 10)
                                        {
                                            continue;
                                        }
                                        else
                                        {
                                            byte[] mData = br.ReadBytes(len);//得到真实jpg数据包
                                            showScreen.Image = new Bitmap(new MemoryStream(mData, true));//显示到屏幕
                                            buffer.RemoveRange(0, len + 10);//移除缓存区内容
                                        }
                                    }


                                }
                            }
                        }
 

猜你喜欢

转载自blog.csdn.net/LUOCHENLONG/article/details/82977930