`

一个Socket数据流的问题

阅读更多
今天遇到个错误是关于GZIPInPutStream压缩流的问题。
一直会爆错:Unexpected end of ZLIB input stream
说未找到正确结束符。

这个错误跟踪就是在我解压缩的地方,
                /*
		 * 解压GZip
		 * @param data
		 * @return
		 */
		public byte[] unCompress(byte[] data) {
			byte[] b = null;
			try {
				ByteArrayInputStream bis = new ByteArrayInputStream(data);
				GZIPInputStream gzip = new GZIPInputStream(bis);
				byte[] buf = new byte[data.length];
				int num = -1;
				ByteArrayOutputStream baos = new ByteArrayOutputStream();

				while ((num = gzip.read(buf, 0, buf.length)) != -1) {//报错就在这read方法里,没找到正确的结束符
					baos.write(buf, 0, num);
				}
				baos.flush();
				b = baos.toByteArray();
				baos.close();
				gzip.close();
				 bis.close();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			return b;
		}


这地方试了好几种流也没搞定,后来我就以为服务端Socket发送数据时候出了问题,一直测也没出来结果,最后还是有个同事,仔细看了他自己写的东西,经过修改大半天,发现是网络流传过来的时候没读完整导致这问题出现了。
//省略
                 Socket socket=null;
		 DataOutputStream dos=null;
		 DataInputStream dis=null;
		 try {
			 //从Map里面获取.
			 socket=new Socket(peerip,peerport);
			 socket.setSoTimeout(timeout);
			 dos = new DataOutputStream(socket.getOutputStream());
			 dis = new DataInputStream(socket.getInputStream());
			dos.write(data);
			dos.flush();
			byte[] len=new byte[8];
			dis.read(len);//数据规则总长度
			int length = Integer.parseInt(new String(len).trim());
			byte[] bCode=new byte[4];
			dis.read(bCode);//数据规则码
			String code=new String(bCode);
			length = length-8;
			byte[] body = new byte[length];
			int num = 0;
			while(num<length) {//问题就出在这里,原来是写dis.read(body, 0, length);
				num += dis.read(body,num,length - num);
			}
			byte[] bContent = unCompress(body);//解压
			return new String(bContent);
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
//省略


这样的错增长了一次见识,记录下来
分享到:
评论

相关推荐

    C# Socket编程(4)初识Socket和数据流

    一个简单的TCP Socket程序包括服务端和客户端两部分。服务端需要监听特定端口,等待客户端连接;客户端则发起连接请求,与服务端建立连接后进行数据交换。 2.1 服务端程序 服务端通常包含以下步骤: - 创建Socket...

    java socket 视频流转发socket

    4. **转发视频流**:处理接收到的视频数据后,服务器可能需要将数据转发到其他地方,比如另一个ServerSocket或Socket。这需要创建一个新的Socket连接到目标地址,并通过`OutputStream`写入数据: ```java Socket ...

    c# 异步socket(能发送文本,文件和数据流)

    本主题将深入探讨如何利用C#的异步Socket实现发送文本、文件以及数据流的功能。 1. **异步Socket基础** 异步Socket编程模式基于.NET Framework中的`System.Net.Sockets.Socket`类,通过调用异步方法如`...

    Android笔记:Socket客户端收发数据

    本文将深入探讨如何在Android平台上创建一个Socket客户端,以及如何通过TCP协议进行数据的发送和接收。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Android中...

    c#使用一个socket同时发送字符串和文件

    在VS2005环境下,我们可以通过C#的Socket类实现一个客户端与服务器端之间的通信,不仅可以发送字符串数据,还能同时发送文件。下面将详细解释如何实现这个功能。 首先,我们需要了解Socket的基本用法。在C#中,`...

    java使用Socket类接收和发送数据

    - 获取输出流:使用`Socket`对象的`getOutputStream()`方法可以获得一个`OutputStream`,通过这个输出流可以将数据发送到服务器。通常会使用`DataOutputStream`或者`PrintStream`来方便地写入各种类型的数据。 ```...

    多客户数据流 Socket 网络程序的开发实验程序 北航网络实验

    多客户数据流 Socket 网络程序的开发实验程序,包括java工程和实现文档。16年网络实验课本上的实验。

    接收socket数据拼帧解码h264

    java层接收socket数据,然后传到C层用av_parser_parse2()来组帧解码H264裸流

    android socket surface视频流播放器

    在Android平台上,构建一个Socket视频流播放器是一个高级任务,涉及到网络编程、多媒体处理和UI渲染等多个技术领域。本文将详细解析"android socket surface mediacodec h264"这个主题,涵盖如何通过Socket接收视频...

    socket定时发送数据小程序

    本项目“socket定时发送数据小程序”正是这样一个专注于通过定时器发送数据的应用。在这个程序中,我们利用了Socket接口来建立客户端与服务器端的连接,并通过定时器(Timer)实现周期性地发送数据。 首先,我们要...

    c# Socket 多线程 分包 发送/接受数据

    例如,一个线程负责接收数据,另一个线程负责处理接收到的数据并发送响应。 3. **分包发送/接收数据**: 当需要发送的数据量较大时,一次发送可能会超过Socket的缓冲区大小,这时就需要将大数据拆分成多个小的...

    Socket实现一对一聊天

    Socket是网络编程中的一个重要概念,它是两台计算机之间建立连接并进行数据传输的接口。在TCP/IP协议栈中,Socket提供了进程间通信的能力,允许不同设备上的程序通过Internet进行通信。 **2. 服务端实现** 服务端...

    Android开发,Socket Client端和Socket Server端数据发送和接收

    - **Socket定义**:Socket是网络编程中的一个接口,它允许应用程序通过TCP/IP协议进行数据交换。在Java中,Socket类和ServerSocket类提供了客户端和服务端的实现。 - **TCP/IP协议**:传输控制协议/因特网协议,...

    Android Socket编程实现服务器数据读取

    `readLine()`方法会逐行读取服务器发送的数据,直到遇到换行符或者数据流结束。 3. **发送数据**: 同样,我们可以使用Socket的`OutputStream`来发送数据给服务器。通常我们会用到`PrintWriter`或`...

    HPSocket.Net-develop_hpsocket.net_HPSocket_.net_socket_tcp_

    【描述】"C# 版socket 收发TCP协议有模版样例"表明这个资源包含了一个具体的实例,展示了如何在C#中使用Socket类进行TCP协议的数据发送与接收。在.NET框架中,Socket类是网络通信的基础,它提供了对TCP/IP和UDP/IP...

    java socket 视频流转发socket.zip

    - **转发**:处理后的数据通过另一个Socket发送到目标地址,即另一台服务器或客户端。这通常涉及到多线程处理,以实现并发的视频流转发。 4. **多线程** - **并发处理**:由于可能同时有多个客户端连接,服务器端...

    socket详解 socket详解 socket详解 socket详解

    在网络编程中,Socket 是一个基本概念, plays a crucial role in building network applications. 在 C# 中,Socket 编程是通过使用 System.Net.Sockets 命名空间中的类和方法来实现的。下面,我们将详细介绍 ...

    单线程Socket编程实现mysql数据读取

    一个Socket服务器首先需要创建一个监听Socket,绑定到特定的IP地址和端口上,然后调用`listen()`函数开始监听连接请求。当客户端请求连接时,服务器调用`accept()`函数接收连接,并返回一个新的Socket用于与客户端...

    javaCV将socket获取的视频流推到流媒体(RTMP)服务器jar

    在这个案例中,Socket用于接收视频流,可能是一个从远程设备(如摄像头)发送过来的实时数据流。 3. **RTMP (Real-Time Messaging Protocol)**: RTMP是一种专为音频、视频数据实时传输而设计的协议,常用于将视频流...

Global site tag (gtag.js) - Google Analytics