全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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程序设计有所帮助。


# Java  # Socket  # 传输  # 压缩对象  # Java基于Socket实现简单的多线程回显服务器功能示例  # java基于socket传输zip文件功能示例  # Java Socket使用加密协议进行传输对象的方法  # Java Socket实现单线程通信的方法示例  # Java中Socket设置连接超时的代码分享  # Java查看本机端口是否被占用源码  # 就可以  # 情况下  # 操作技巧  # 相关内容  # 然后又  # 感兴趣  # 数据结构  # 给大家  # 然后再  # 时就  # 比较大  # 更多关于  # 所述  # 程序设计  # 实现了  # 编程技巧  # 但是在  # 讲述了  # 分别在  # String 


相关文章: 建站之星安装后界面空白如何解决?  安云自助建站系统如何快速提升SEO排名?  如何通过虚拟主机空间快速建站?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何通过商城免费建站系统源码自定义网站主题?  宝塔Windows建站如何避免显示默认IIS页面?  如何通过WDCP绑定主域名及创建子域名站点?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  非常酷的网站设计制作软件,酷培ai教育官方网站?  图册素材网站设计制作软件,图册的导出方式有几种?  建站之星如何开启自定义404页面避免用户流失?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何配置WinSCP新建站点的密钥验证步骤?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何快速配置高效服务器建站软件?  制作网站的基本流程,设计网站的软件是什么?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何获取开源自助建站系统免费下载链接?  建站之星展会模板:智能建站与自助搭建高效解决方案  建站主机数据库如何配置才能提升网站性能?  建站之星代理商如何保障技术支持与售后服务?  独立制作一个网站多少钱,建立网站需要花多少钱?  如何通过二级域名建站提升品牌影响力?  PHP正则匹配日期和时间(时间戳转换)的实例代码  Android滚轮选择时间控件使用详解  宝塔面板如何快速创建新站点?  广州建站公司哪家好?十大优质服务商推荐  如何快速搭建安全的FTP站点?  网站企业制作流程,用什么语言做企业网站比较好?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  在线教育网站制作平台,山西立德教育官网?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  广平建站公司哪家专业可靠?如何选择?  南京网站制作费用,南京远驱官方网站?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  香港服务器部署网站为何提示未备案?  建站之星图片链接生成指南:自助建站与智能设计教程  ,想在网上投简历,哪几个网站比较好?  如何在万网开始建站?分步指南解析  设计网站制作公司有哪些,制作网页教程?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  子杰智能建站系统|零代码开发与AI生成SEO优化指南  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  如何选择香港主机高效搭建外贸独立站?  如何选择高性价比服务器搭建个人网站?  Python多线程使用规范_线程安全解析【教程】  如何快速上传建站程序避免常见错误?  招商网站制作流程,网站招商广告语?  如何在云主机快速搭建网站站点? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。