文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java Socket中怎样传输压缩对象

2023-06-17 10:59

关注

这篇文章将为大家详细讲解有关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);              }              try {                  oos.close();              } catch (IOException e) {              }              try {                  ois.close();              } catch (IOException e) {              }              try {                  socket.close();              } catch (IOException e) {              }          }      }  }

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

关于Java Socket中怎样传输压缩对象就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯