上一篇文章说到了用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. C语言:自己编写的简易ftp客户端,包含(列表,进入目录,上传文件,下载文件,删除文件)功能

    //简易ftp客户端#include <stdio.h> #include <string.h> #include <sys/types.h> #include & ...

  2. CentOS7安装Nginx、MySQL、PHP

    之前才网上找了好多文章,但是配置总会出错,后来傻傻的发现官方文档都有的,当然配合网上文章说明更好,因此本文只说一个大概 安装PHP 官方配置 配置用户和用户组,需要有根目录权限 vim /usr/lo ...

  3. tcl之基本语法—3

  4. MySQL 如何生成日期表

    MySQL 如何生成日期表 在开发过程中,经常会遇到统计问题,通常交易信息都不是连续的,此时,统计出来的数据都是不连续的,所以提前生成一个时期表,当没有交易数据的时候填充0,就可以了,下面是生成日期表 ...

  5. unix gcc编译过程

    gcc编译过程 现代编译器常见的编译过程: 源文件-->预处理-->编译/优化-->汇编-->链接-->可执行文件 对于gcc而言: 第一步 预处理       命令: ...

  6. German Collegiate Programming Contest 2018​ C. Coolest Ski Route

    John loves winter. Every skiing season he goes heli-skiing with his friends. To do so, they rent a h ...

  7. android 极光推送 声音与振动 的关闭和开启

    前言:最近刚好在写一些推送方面的东西,又是新手,不断在网上找资料,很少,不过还是找到了一些,反正百度我是再也不想百度了,谷歌一下子就能找到想要的. 废话不多说. 1.主要方法就是如下一个函数 priv ...

  8. python协程--yield和yield from

    字典为动词“to yield”给出了两个释义:产出和让步.对于 Python 生成器中的 yield 来说,这两个含义都成立.yield item 这行代码会产出一个值,提供给 next(...) 的 ...

  9. React-表单操作

    用户在表单填入的内容,属于用户跟组件的互动,所以不能用 this.props 读取 <!DOCTYPE html> <html lang="zh-cn"> ...

  10. vue2.x生命周期

    vue2.x生命周期 1. beforeCreate 在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用. 2. created 实例已经创建 ...