中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java Socket實現傳輸壓縮對象的方法示例

發布時間:2020-10-13 09:43:08 來源:腳本之家 閱讀:147 作者:kongxx 欄目:編程語言

本文實例講述了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程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河曲县| 天气| 天水市| 汕尾市| 綦江县| 普格县| 冷水江市| 大英县| 封丘县| 巨鹿县| 固原市| 武汉市| 麻阳| 金溪县| 和政县| 伊金霍洛旗| 邵武市| 阳山县| 剑河县| 台湾省| 遵化市| 顺昌县| 金华市| 侯马市| 东乌珠穆沁旗| 濮阳县| 利津县| 张家港市| 盐山县| 普安县| 鄢陵县| 汶上县| 丹东市| 工布江达县| 合作市| 西平县| 安泽县| 溆浦县| 方山县| 乐业县| 临潭县|