今天遇到个错误是关于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();
}
//省略
这样的错增长了一次见识,记录下来
分享到:
相关推荐
4. **转发视频流**:处理接收到的视频数据后,服务器可能需要将数据转发到其他地方,比如另一个ServerSocket或Socket。这需要创建一个新的Socket连接到目标地址,并通过`OutputStream`写入数据: ```java Socket ...
一个简单的TCP Socket程序包括服务端和客户端两部分。服务端需要监听特定端口,等待客户端连接;客户端则发起连接请求,与服务端建立连接后进行数据交换。 2.1 服务端程序 服务端通常包含以下步骤: - 创建Socket...
本主题将深入探讨如何利用C#的异步Socket实现发送文本、文件以及数据流的功能。 1. **异步Socket基础** 异步Socket编程模式基于.NET Framework中的`System.Net.Sockets.Socket`类,通过调用异步方法如`...
本文将深入探讨如何在Android平台上创建一个Socket客户端,以及如何通过TCP协议进行数据的发送和接收。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Android中...
在VS2005环境下,我们可以通过C#的Socket类实现一个客户端与服务器端之间的通信,不仅可以发送字符串数据,还能同时发送文件。下面将详细解释如何实现这个功能。 首先,我们需要了解Socket的基本用法。在C#中,`...
多客户数据流 Socket 网络程序的开发实验程序,包括java工程和实现文档。16年网络实验课本上的实验。
java层接收socket数据,然后传到C层用av_parser_parse2()来组帧解码H264裸流
在Android平台上,构建一个Socket视频流播放器是一个高级任务,涉及到网络编程、多媒体处理和UI渲染等多个技术领域。本文将详细解析"android socket surface mediacodec h264"这个主题,涵盖如何通过Socket接收视频...
本项目“socket定时发送数据小程序”正是这样一个专注于通过定时器发送数据的应用。在这个程序中,我们利用了Socket接口来建立客户端与服务器端的连接,并通过定时器(Timer)实现周期性地发送数据。 首先,我们要...
- 获取输出流:使用`Socket`对象的`getOutputStream()`方法可以获得一个`OutputStream`,通过这个输出流可以将数据发送到服务器。通常会使用`DataOutputStream`或者`PrintStream`来方便地写入各种类型的数据。 ```...
例如,一个线程负责接收数据,另一个线程负责处理接收到的数据并发送响应。 3. **分包发送/接收数据**: 当需要发送的数据量较大时,一次发送可能会超过Socket的缓冲区大小,这时就需要将大数据拆分成多个小的...
Socket是网络编程中的一个重要概念,它是两台计算机之间建立连接并进行数据传输的接口。在TCP/IP协议栈中,Socket提供了进程间通信的能力,允许不同设备上的程序通过Internet进行通信。 **2. 服务端实现** 服务端...
- **Socket定义**:Socket是网络编程中的一个接口,它允许应用程序通过TCP/IP协议进行数据交换。在Java中,Socket类和ServerSocket类提供了客户端和服务端的实现。 - **TCP/IP协议**:传输控制协议/因特网协议,...
在这个案例中,Socket用于接收视频流,可能是一个从远程设备(如摄像头)发送过来的实时数据流。 3. **RTMP (Real-Time Messaging Protocol)**: RTMP是一种专为音频、视频数据实时传输而设计的协议,常用于将视频流...
`readLine()`方法会逐行读取服务器发送的数据,直到遇到换行符或者数据流结束。 3. **发送数据**: 同样,我们可以使用Socket的`OutputStream`来发送数据给服务器。通常我们会用到`PrintWriter`或`...
【描述】"C# 版socket 收发TCP协议有模版样例"表明这个资源包含了一个具体的实例,展示了如何在C#中使用Socket类进行TCP协议的数据发送与接收。在.NET框架中,Socket类是网络通信的基础,它提供了对TCP/IP和UDP/IP...
- **转发**:处理后的数据通过另一个Socket发送到目标地址,即另一台服务器或客户端。这通常涉及到多线程处理,以实现并发的视频流转发。 4. **多线程** - **并发处理**:由于可能同时有多个客户端连接,服务器端...
在网络编程中,Socket 是一个基本概念, plays a crucial role in building network applications. 在 C# 中,Socket 编程是通过使用 System.Net.Sockets 命名空间中的类和方法来实现的。下面,我们将详细介绍 ...
一个Socket服务器首先需要创建一个监听Socket,绑定到特定的IP地址和端口上,然后调用`listen()`函数开始监听连接请求。当客户端请求连接时,服务器调用`accept()`函数接收连接,并返回一个新的Socket用于与客户端...