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

发布时间 - 2026-01-11 01:59:53    点击率:

本文实例讲述了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 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  Laravel如何实现用户注册和登录?(Auth脚手架指南)  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何生成腾讯云建站专用兑换码?  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  如何快速查询网站的真实建站时间?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  企业网站制作这些问题要关注  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  如何在IIS7中新建站点?详细步骤解析  如何为不同团队 ID 动态生成多个独立按钮  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Laravel安装步骤详细教程_Laravel环境搭建指南  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  香港服务器选型指南:免备案配置与高效建站方案解析  Python面向对象测试方法_mock解析【教程】  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Laravel如何处理表单验证?(Requests代码示例)  Laravel中的Facade(门面)到底是什么原理  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Laravel如何使用Blade组件和插槽?(Component代码示例)  油猴 教程,油猴搜脚本为什么会网页无法显示?  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何用好域名打造高点击率的自主建站?  Laravel观察者模式如何使用_Laravel Model Observer配置  在centOS 7安装mysql 5.7的详细教程  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  焦点电影公司作品,电影焦点结局是什么?  如何快速登录WAP自助建站平台?  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  什么是javascript作用域_全局和局部作用域有什么区别?  个人网站制作流程图片大全,个人网站如何注销?  Laravel如何处理异常和错误?(Handler示例)  LinuxCD持续部署教程_自动发布与回滚机制  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  WordPress 子目录安装中正确处理脚本路径的完整指南  Python文件操作最佳实践_稳定性说明【指导】  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel如何发送系统通知?(Notification渠道示例)