上一篇文章说到了用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 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限. 在删除数据库过 ...

  2. linux 编辑文档

    本篇主要分享下vi 命令行的操作: vi  /etc/sysconfig/iptabels 首先我们需要理解putty客户端的复制 粘贴 插入文档  退出等命令 复制:指在putty客户端中的选择复制 ...

  3. HTTP-点开浏览器输入网址背后发生的那点事

    前言 Internet最早来源于美国国防部ARPANet,1969年投入运行,到现在已有很长一段路了,各位想要了解发展史可以百度下,这里就不多说了. 现如今当我们想要获取一些资料,首先是打开某个浏览器 ...

  4. yum安装报错

    检查了好久才知道原来是 sudo nano /etc/sysconfig/network-scripts/ifcfg-ens33 下的DNS配错了,改好之后,sudo service network ...

  5. nuxt.js express模板项目服务器部署

    nuxt版本:0.10.6 技术栈:nuxt.js, express, pm2 部署环境:windows server 之前用nuxt.js 的express的模板项目在windows下用nginx进 ...

  6. 【php】如何配置自主域名腾讯企业邮箱

    腾讯企业邮配置 protocal ssl smtp port 465 host smtp.exmail.qq.com user email account passwd email passwd

  7. 【jenkins】【java】【tomcat】windows host key verification failed

    适用于windows系统 出现这个问题的原因tomcat启动的用户找不到本地公私钥路径 如果tomcat 启动时候选择 local system account (默认此选项),请把你的公私钥文件(i ...

  8. ThinkPHP邮件发送S(Smtp + Mail + phpmailer)

    三种邮件发送介绍:(Smtp,Mail以及phpmailer)ThinkPhp 框架下开发. 邮件发送配置先前准备(用该账号做测试用):(这里用新浪邮箱服务器)将自己的新浪邮箱开通 POP3/SMTP ...

  9. ICSharpCode.SharpZipLib.dll

    using ICSharpCode.SharpZipLib.Checksums; using ICSharpCode.SharpZipLib.Zip; namespace { /// <summ ...

  10. Insertion Sort Gym - 101955C 思路+推公式

    题目:题目链接 题意:对长为n的1到n的数列的前k个数排序后数列的最长上升子序列长度不小于n-1的数列的种数,训练赛时怎么都读不明白这个题意,最后还是赛后问了旁队才算看懂,英语水平急需拯救55555 ...