上一篇文章说到了用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. linux 服务器被植入ddgs、qW3xT.2挖矿病毒处理记录

    被入侵后的现象: 发现有qW3xT.2与ddgs两个异常进程,消耗了较高的cpu,kill掉后 过一会就会重新出现. kill 掉这两个异常进程后,过一段时间看到了如下进程: 首先在/etc/sysc ...

  2. 推荐Android几个优质的完整项目学习

    ==>来自于微信公众号==鸿洋.大家可以关注一波大神之作. 后台经常有人问我能不能推荐几个完整项目用于学习.借着周末的机会,给大家推荐几个,项目我基本都在本地运行过,并且会在文章末尾提供每个项目 ...

  3. phpstorm将本地代码传递到远程服务器

    由于对vim不太熟悉,效率比较低,作为过渡阶段,采用本地编写代码,然后上传到开发机上,进行调试 前提是服务器开启了ftp服务:http://www.cnblogs.com/redirect/p/693 ...

  4. win8 远程桌面时提示凭证不工作问题的终极解决办法

    环境说明 远程办公电脑(放置于公司.自用办公电脑.win8系统) 远程连接客户机(放置于家中.家庭日常所用.win8系统) 故障现象 最近在使用远程桌面连接公司的办公电脑时,突然发现win8系统总是无 ...

  5. Oracle 学习笔记(Windows 环境下安装 + PL/SQL)

    Oracle 安装.PL/SQL 配置使用  前言:因更换机械硬盘为 SSD 固态硬盘装了新 Windows 7 系统,需要重新搭建开发环境,把 Oracle 安装过程和 PL/SQL 配置使用做下笔 ...

  6. 理解机器为什么可以学习(五)---Noise and Error

    之前我们讨论了VC Dimension,最终得到结论,如果我们的hypetheset的VC Dimension是有限的,并且有足够的资料,演算法能够找到一个hypethesis,它的Ein很低的话,那 ...

  7. [python][django学习篇][11]后台admin用户登录博客,添加文章---这一章和博客首页设计没有关系

    1 如果没有创建超级管理员账号,先要创建python manage.py createsuperuser 2 在admin后台注册模型(如果没有这一步,登录http://127.0.0.1:8000/ ...

  8. java 课堂笔记

  9. sql cte的使用

    cte是可以连续使用的,多个cte用逗号隔开,但是只能有一个with 百度文章标题:Sql server中使用with as 提高性能+高效分页

  10. order by 对null的处理

    [Oracle 结论] order by colum asc 时,null默认被放在最后order by colum desc 时,null默认被放在最前nulls first 时,强制null放在最 ...