上一篇文章说到了用Java Socket来传输对象,但是在有些情况下比如网络环境不好或者对象比较大的情况下需要把数据对象进行压缩然后在传输,此时就需要压缩这些对象流,此时就 可以GZIPInputStream和GZIPOutputStream来处理一下socket的InputStream和OutputStream。

仍然需要一个实现了java.io.Serializable接口的简单Java对象

  1. package com.googlecode.garbagecan.test.socket.sample4;
  2. public class User implements java.io.Serializable {
  3. private static final long serialVersionUID = 1L;
  4. private String name;
  5. private String password;
  6. public User() {
  7. }
  8. public User(String name, String password) {
  9. this.name = name;
  10. this.password = password;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public String getPassword() {
  19. return password;
  20. }
  21. public void setPassword(String password) {
  22. this.password = password;
  23. }
  24. }


Server端使用,socket的InputStream首先被包装成GZIPInputStream,然后又被包装成
ObjectInputStream,而socket的OutputStream首先被包装成GZIPOutputStream,然后又被包装成
ObjectOutputStream,如下:

  1. package com.googlecode.garbagecan.test.socket.sample4;
  2. import java.io.IOException;
  3. import java.io.ObjectInputStream;
  4. import java.io.ObjectOutputStream;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. import java.util.logging.Level;
  8. import java.util.logging.Logger;
  9. import java.util.zip.GZIPInputStream;
  10. import java.util.zip.GZIPOutputStream;
  11. public class MyServer {
  12. private final static Logger logger = Logger.getLogger(MyServer.class.getName());
  13. public static void main(String[] args) throws IOException {
  14. ServerSocket server = new ServerSocket(10000);
  15. while (true) {
  16. Socket socket = server.accept();
  17. socket.setSoTimeout(10 * 1000);
  18. invoke(socket);
  19. }
  20. }
  21. private static void invoke(final Socket socket) throws IOException {
  22. new Thread(new Runnable() {
  23. public void run() {
  24. GZIPInputStream gzipis = null;
  25. ObjectInputStream ois = null;
  26. GZIPOutputStream gzipos = null;
  27. ObjectOutputStream oos = null;
  28. try {
  29. gzipis = new GZIPInputStream(socket.getInputStream());
  30. ois = new ObjectInputStream(gzipis);
  31. gzipos = new GZIPOutputStream(socket.getOutputStream());
  32. oos = new ObjectOutputStream(gzipos);
  33. Object obj = ois.readObject();
  34. User user = (User)obj;
  35. System.out.println("user: " + user.getName() + "/" + user.getPassword());
  36. user.setName(user.getName() + "_new");
  37. user.setPassword(user.getPassword() + "_new");
  38. oos.writeObject(user);
  39. oos.flush();
  40. gzipos.finish();
  41. } catch (IOException ex) {
  42. logger.log(Level.SEVERE, null, ex);
  43. } catch(ClassNotFoundException ex) {
  44. logger.log(Level.SEVERE, null, ex);
  45. } finally {
  46. try {
  47. ois.close();
  48. } catch(Exception ex) {}
  49. try {
  50. oos.close();
  51. } catch(Exception ex) {}
  52. try {
  53. socket.close();
  54. } catch(Exception ex) {}
  55. }
  56. }
  57. }).start();
  58. }
  59. }

Client也和Server端类似,同样要不socket的XXXStream包装成GZIPXXXStream,然后再包装成ObjectXXXStream,如下:

  1. package com.googlecode.garbagecan.test.socket.sample4;
  2. import java.io.IOException;
  3. import java.io.ObjectInputStream;
  4. import java.io.ObjectOutputStream;
  5. import java.net.InetSocketAddress;
  6. import java.net.Socket;
  7. import java.net.SocketAddress;
  8. import java.util.logging.Level;
  9. import java.util.logging.Logger;
  10. import java.util.zip.GZIPInputStream;
  11. import java.util.zip.GZIPOutputStream;
  12. public class MyClient {
  13. private final static Logger logger = Logger.getLogger(MyClient.class.getName());
  14. public static void main(String[] args) throws Exception {
  15. for (int i = 0; i < 10; i++) {
  16. Socket socket = null;
  17. GZIPOutputStream gzipos = null;
  18. ObjectOutputStream oos = null;
  19. GZIPInputStream gzipis = null;
  20. ObjectInputStream ois = null;
  21. try {
  22. socket = new Socket();
  23. SocketAddress socketAddress = new InetSocketAddress("localhost", 10000);
  24. socket.connect(socketAddress, 10 * 1000);
  25. socket.setSoTimeout(10 * 1000);
  26. gzipos = new GZIPOutputStream(socket.getOutputStream());
  27. oos = new ObjectOutputStream(gzipos);
  28. User user = new User("user_" + i, "password_" + i);
  29. oos.writeObject(user);
  30. oos.flush();
  31. gzipos.finish();
  32. gzipis = new GZIPInputStream(socket.getInputStream());
  33. ois = new ObjectInputStream(gzipis);
  34. Object obj = ois.readObject();
  35. if (obj != null) {
  36. user = (User)obj;
  37. System.out.println("user: " + user.getName() + "/" + user.getPassword());
  38. }
  39. } catch(IOException ex) {
  40. logger.log(Level.SEVERE, null, ex);
  41. } finally {
  42. try {
  43. ois.close();
  44. } catch(Exception ex) {}
  45. try {
  46. oos.close();
  47. } catch(Exception ex) {}
  48. try {
  49. socket.close();
  50. } catch(Exception ex) {}
  51. }
  52. }
  53. }
  54. }

最后测试上面的代码,首先运行Server类,然后运行Client类,就可以分别在Server端和Client端控制台看到接收到的User对象实例了。

sokect数据压缩实现的更多相关文章

  1. 【探索】利用 canvas 实现数据压缩

    前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...

  2. sokect编程进阶

    IO模型 什么是IO? IO:input和output的缩写,即输入/输出端口.每个设备都会有一个专用的I/O地址,用来处理自己的输入输出信息 同步.异步.阻塞.非阻塞 同步和异步的概念描述的是用户线 ...

  3. SQL Server 2008中的数据压缩

    SQL Server 2008中引入了数据压缩的功能,允许在表.索引和分区中执行数据压缩.这样不仅可以大大节省磁盘的占用空间,还允许将更多数据页装入内存中,从而降低磁 盘IO,提升查询的性能.当然,凡 ...

  4. 【数据压缩】LZ77算法原理及实现

    1. 引言 LZ77算法是采用字典做数据压缩的算法,由以色列的两位大神Jacob Ziv与Abraham Lempel在1977年发表的论文<A Universal Algorithm for ...

  5. 【数据压缩】Huffman编码

    1. 压缩编码概述 数据压缩在日常生活极为常见,平常所用到jpg.mp3均采用数据压缩(采用Huffman编码)以减少占用空间.编码\(C\)是指从字符空间\(A\)到码字表\(X\)的映射.数据压缩 ...

  6. C#编程总结(十三)数据压缩

    C#编程总结(十三)数据压缩 在进行文件存储或者数据传输时,为了节省空间流量,需要对数据或文件进行压缩.在这里我们讲述通过C#实现数据压缩. 一.GZipStream压缩 微软提供用于压缩和解压缩流的 ...

  7. 高性能的数据压缩库libzling

    libzling(https://github.com/richox/libzling)是一款高性能的数据压缩库,在压缩时间和压缩率上都超过了流行的zlib/gzip.libzling使用的是ROLZ ...

  8. cxf数据压缩

    一.HTTP数据的压缩 在http协议中当content-encoding对应的值为gzip,deflate,x-gzip,x-deflate时,数据是经过了压缩之后再进行传输的.有些时候我们当我们传 ...

  9. Android和WCF通信 - 大数据压缩后传输

    Android和WCF通信 - 大数据压缩后传输 本帖来源:http://www.cnblogs.com/lykbk/archive/2013/08/15/3259045.html 最近一直在优化项目 ...

随机推荐

  1. k8s的secret基本概念及案例

    secret相对于configMap,功能上是相似的但是secret是以其他编码方式去记录配置信息的,但是也可以被解读,只不过有技术门槛,不是那么容易就被解读.使用base64可以解码:echo ** ...

  2. ES6箭头函数基本用法

    ES6箭头函数基本用法 ``` window.onload = function(){ alert(abc); } //箭头函数 window.onload = ()=>{ alert(&quo ...

  3. 震惊!几道Python 理论面试题,Python面试题No18

    本面试题题库,由公号:非本科程序员 整理发布 第1题: 简述解释型和编译型编程语言? 解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候 ...

  4. 线程之sleep(),wait(),yield(),join()等等的方法的区别

    操作线程的常用方法大体上有sleep(),join(),yield()(让位),wait(),notify(),notifyAll(),关键字synchronized等等.    由于这些方法功能有些 ...

  5. python3.7 sys模块

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 sys模块 #sys模块负责程序与python解释器的交互,提供 ...

  6. A1027 Colors in Mars (20)(20 分)

    A1027 Colors in Mars (20)(20 分) People in Mars represent the colors in their computers in a similar ...

  7. LightOJ - 1341 Aladdin and the Flying Carpet(数论)

    题意 有一块矩形(也可能是正方形)的飞毯. 给定飞毯的面积\(n\)和最小可能的边长\(a\),求可能有多少种不同边长的飞毯.(\(1<=a<=n<=1e12\)) 如面积\(n=6 ...

  8. HDU - 1054 Strategic Game (二分图匹配模板题)

    二分图匹配模板题 #include <bits/stdc++.h> #define FOPI freopen("in.txt", "r", stdi ...

  9. Codeforces Round #456 (Div. 2) A. Tricky Alchemy

    传送门:http://codeforces.com/contest/912/problem/A A. Tricky Alchemy time limit per test1 second memory ...

  10. 第八届蓝桥杯C/C++ B组省赛----分巧克力

    分巧克力 问题描述 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需要从这 N 块巧 ...