上一篇文章说到了用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. 十八、MySQL 排序

    MySQL 排序 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据. 如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段 ...

  2. tcl之基本语法—2

  3. Android Studio 安装与使用ADB wifi 无线调试

    首先,安装ADB WIFI File->Settings->Plugins 其次,用USB连接手机与电脑(并开启手机的调试模式) 任务栏若无提示,即可拔下USB线,开始无线调试 任务栏若是 ...

  4. pandas知识点(汇总和计算描述统计)

    调用DataFrame的sum方法会返还一个含有列的Series: In [5]: df = DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0 ...

  5. Django runserver支持https

    创建自签名ssl证书 1.下载软件openssl-0.9.8k_WIN32 2.解压后进入bin目录,双击打开openssl.exe,依次运行如下命令 genrsa -des3 -out server ...

  6. 问题 1936: [蓝桥杯][算法提高VIP]最大乘积

    问题 1936: [蓝桥杯][算法提高VIP]最大乘积 时间限制: 1Sec 内存限制: 128MB 提交: 77 解决: 16 题目描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? ...

  7. java多线程安全的问题

    多线程中一定会遇到线程安全的问题,也就是在同一时间N条线程操作了同一变量,这个变量也叫做共享变量. 举例:(错误的示范) 设计一个投票系统,多个人可以对同一个的票数进行投票,下面看具体代码: 代码: ...

  8. leetcode 【 Reverse Nodes in k-Group 】 python 实现

    原题: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...

  9. IOS笔记044-通知和代理(观察者模式和代理模式)

      处理文本输入框的输入事件,单击文本输入框后要弹出键盘. 弹出键盘有两种实现方式:一种代理,一种通知.也就是对应的(观察者模式和代理模式).   1.通知 1.1.准备工作 每一个应用程序都有一个通 ...

  10. 堆STL和重载运算符

    大根堆: 1.priority_queue<int> q;[默认 2. priority_queue< node,vector<node>,less<node> ...