Java Socket实现传输压缩对象的方法示例

 更新时间:2017年06月22日 08:58:04   作者:kongxx  
这篇文章主要介绍了Java Socket实现传输压缩对象的方法,结合具体实例形式分析了java socket针对数据的压缩、传输、接收、解压缩等操作相关实现技巧,需要的朋友可以参考下

本文实例讲述了Java Socket实现传输压缩对象的方法。分享给大家供大家参考,具体如下:

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

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

package com.googlecode.garbagecan.test.socket.sample4;
public class User implements java.io.Serializable {
  private static final long serialVersionUID = 1L;
  private String name;
  private String password;
  public User() {
  }
  public User(String name, String password) {
    this.name = name;
    this.password = password;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
}

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

package com.googlecode.garbagecan.test.socket.sample4;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class MyServer {
  private final static Logger logger = Logger.getLogger(MyServer.class.getName());
  public static void main(String[] args) throws IOException {
    ServerSocket server = new ServerSocket(10000);
    while (true) {
      Socket socket = server.accept();
      socket.setSoTimeout(10 * 1000);
      invoke(socket);
    }
  }
  private static void invoke(final Socket socket) throws IOException {
    new Thread(new Runnable() {
      public void run() {
        GZIPInputStream gzipis = null;
        ObjectInputStream ois = null;
        GZIPOutputStream gzipos = null;
        ObjectOutputStream oos = null;
        try {
          gzipis = new GZIPInputStream(socket.getInputStream());
          ois = new ObjectInputStream(gzipis);
          gzipos = new GZIPOutputStream(socket.getOutputStream());
          oos = new ObjectOutputStream(gzipos);
          Object obj = ois.readObject();
          User user = (User)obj;
          System.out.println("user: " + user.getName() + "/" + user.getPassword());
          user.setName(user.getName() + "_new");
          user.setPassword(user.getPassword() + "_new");
          oos.writeObject(user);
          oos.flush();
          gzipos.finish();
        } catch (IOException ex) {
          logger.log(Level.SEVERE, null, ex);
        } catch(ClassNotFoundException ex) {
          logger.log(Level.SEVERE, null, ex);
        } finally {
          try {
            ois.close();
          } catch(Exception ex) {}
          try {
            oos.close();
          } catch(Exception ex) {}
          try {
            socket.close();
          } catch(Exception ex) {}
        }
      }
    }).start();
  }
}

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

package com.googlecode.garbagecan.test.socket.sample4;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class MyClient {
  private final static Logger logger = Logger.getLogger(MyClient.class.getName());
  public static void main(String[] args) throws Exception {
    for (int i = 0; i < 10; i++) {
      Socket socket = null;
      GZIPOutputStream gzipos = null;
      ObjectOutputStream oos = null;
      GZIPInputStream gzipis = null;
      ObjectInputStream ois = null;
      try {
        socket = new Socket();
        SocketAddress socketAddress = new InetSocketAddress("localhost", 10000);
        socket.connect(socketAddress, 10 * 1000);
        socket.setSoTimeout(10 * 1000);
        gzipos = new GZIPOutputStream(socket.getOutputStream());
        oos = new ObjectOutputStream(gzipos);
        User user = new User("user_" + i, "password_" + i);
        oos.writeObject(user);
        oos.flush();
        gzipos.finish();
        gzipis = new GZIPInputStream(socket.getInputStream());
        ois = new ObjectInputStream(gzipis);
        Object obj = ois.readObject();
        if (obj != null) {
          user = (User)obj;
          System.out.println("user: " + user.getName() + "/" + user.getPassword());
        }
      } catch(IOException ex) {
        logger.log(Level.SEVERE, null, ex);
      } finally {
        try {
          ois.close();
        } catch(Exception ex) {}
        try {
          oos.close();
        } catch(Exception ex) {}
        try {
          socket.close();
        } catch(Exception ex) {}
      }
    }
  }
}

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

更多关于java相关内容感兴趣的读者可查看本站专题:《Java Socket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • mybatis-plus主键生成策略

    mybatis-plus主键生成策略

    这篇文章主要介绍了mybatis-plus主键生成策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • java实现写入并保存txt文件的代码详解

    java实现写入并保存txt文件的代码详解

    在本篇文章里小编给大家整理了关于java实现写入并保存txt文件的代码实例内容,需要的朋友们可以参考学习下。
    2020-02-02
  • Java分页查询的几种实现方法举例

    Java分页查询的几种实现方法举例

    这篇文章主要给大家介绍了关于Java分页查询的几种实现方法,分页是系统中常用到的功能,只要涉及到查询必定伴随而来的就是分页,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • 加速spring/springboot应用启动速度详解

    加速spring/springboot应用启动速度详解

    这篇文章主要介绍了加速spring/springboot应用启动速度详解,本文通过实例代码给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 一篇文章带你了解Java 中序列化与反序列化

    一篇文章带你了解Java 中序列化与反序列化

    这篇文章主要介绍了Java 序列化与反序列化(Serialization),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • Java正则表达式基础语法详解

    Java正则表达式基础语法详解

    这篇文章主要介绍了Java正则表达式语法,包括常用正则表达式、匹配验证-验证Email是否正确以及字符串中查询字符或者字符串,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 基于Maven的pom.xml文件详解

    基于Maven的pom.xml文件详解

    下面小编就为大家带来一篇基于Maven的pom.xml文件详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 基于javax.validation结合spring的最佳实践

    基于javax.validation结合spring的最佳实践

    这篇文章主要介绍了javax.validation结合spring的最佳实践,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • eclipse+maven+spring mvc项目基本搭建过程

    eclipse+maven+spring mvc项目基本搭建过程

    这篇文章主要介绍了eclipse+maven+spring mvc项目基本搭建过程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 一篇文章带你入门java注解

    一篇文章带你入门java注解

    这篇文章主要介绍了Java注解详细介绍,本文讲解了Java注解是什么、Java注解基础知识、Java注解类型、定义Java注解类型的注意事项等内容,需要的朋友可以参考下
    2021-08-08

最新评论