`
pcpig
  • 浏览: 87385 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

消息压缩和解压缩

阅读更多
    无线开发时,一方面出于给玩家节省流量的考虑,一方面为了加快网络传输速度,需要对过大的消息进行。消息字节大小小于256的压缩就没有太大意义,建议对大于1k的消息进行压缩处理,具体数据可以根据自己的业务进行设定。

参考java代码如下
	/**
	 * 对消息进行压缩,并返回压缩后的字节数组
	 * 
	 * @param bodyBuf
	 * @return
	 * @throws IOException
	 */
	private static byte[] compress(IoBuffer bodyBuf) throws IOException {
		ByteArrayOutputStream fos = new ByteArrayOutputStream();
		ZipOutputStream zops = new ZipOutputStream(fos);
		try {
			zops.putNextEntry(new ZipEntry("t"));

			byte[] byteArr = new byte[bodyBuf.limit()];
			bodyBuf.get(byteArr);
			zops.write(byteArr);
		} finally {
			zops.flush();
			zops.close();
			fos.flush();
			fos.close();
		}

		return fos.toByteArray();
	}

        //解压缩
	private static void decompress(byte[] bytes) throws IOException {
		ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
		ZipInputStream zis = new ZipInputStream(bais);
		zis.getNextEntry();
		int k = 0;
		int ir = -1;
		IoBuffer ioBuffer = IoBuffer.allocate(8192);
		ioBuffer.setAutoExpand(true);
		while ((ir = zis.read()) != -1) {
			k++;
			System.err.print(Integer.toHexString(ir) + " ");
			ioBuffer.put((byte) ir);
		}
		System.err.println("\nByteLength:" + k);
		ioBuffer.flip();
		System.err.println("decompress:" + ioBuffer);
	}
分享到:
评论
1 楼 pcpig 2013-07-10  
同事提醒:网络通讯用gzip由于没有文件结构,压缩效果更好
	private byte[] gzcompress(IoBuffer bodyBuf) throws IOException {
		byte[] byteArr = new byte[bodyBuf.limit()];
		bodyBuf.get(byteArr);
		ByteArrayOutputStream fos = new ByteArrayOutputStream();
		
		GZIPOutputStream zops = new GZIPOutputStream(fos);
		try {
			zops.write(byteArr);
		} finally {
			zops.flush();
			zops.close();
			fos.flush();
			fos.close();
		}
		byte[] m2 = fos.toByteArray();
		logger.debug("消息原始大小:" + byteArr.length /* + "方式1压缩后大小:" + m1.length */
				+ " 方式2压缩后大小:" + m2.length);
		return m2;
	}

相关推荐

Global site tag (gtag.js) - Google Analytics