【问题标题】:java socket sending compressed objectjava socket发送压缩对象
【发布时间】:2018-10-13 05:51:43
【问题描述】:

我想压缩我的可序列化对象并通过 java 套接字发送它们。 可序列化对象:

public class MyObject implements Serializable {

private int id;
private String name;
//getter,setter and equal, hashCode, toString methods

}



public class Sender {

private Socket clientSocket;

public void send(MyObject obj){
GZIPOutputStream gzipOut = new GZIPOutputStream(clientSocket.getOutputStream());
ObjectOutputStream objectOut = new ObjectOutputStream(gzipOut);
objectOut.writeObject(obj);
}
}



public class Receiver {

private Socket serverSocket;

public MyObject receive(){
GZIPInputStream gzipIn = new GZIPInputStream(serverSocket.getInputStream());
ObjectInputStream objectIn = new ObjectInputStream(gzipIn);
return (MyObject) objectIn.readObject();
}

}

这会引发 ZipException: Not in GZIP format at receiver side.

我不会关闭流和套接字,因为需要使用相同的流和套接字发送多个对象(性能方面)

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    ObjectStream 是可用的最详细的序列化格式之一。几乎任何其他序列化在大小上都会更好。 ObjectStreams 必须刷新才能发送所有数据,并且您不能在一个连接中发送多个流,这使得每个连接仅发送一个对象效率低下。

    压缩流最适合大量数据,当您尝试将它们应用于几个字节时,结果会更大,而不是更小。压缩流必须刷新才能读取。

    需要使用相同的流和套接字发送多个对象(性能方面)

    这意味着您必须保留 GZIP/Object 流。每个流不能使用超过一个。

    public class ObjectSocket implements Closeable {
        private final Socket socket;
        private final ObjectOutputStream output;
        private final ObjectInputStream input;
    
        public ObjectSocket(Socket socket) throws IOException {
            this.socket = socket;
            this.output = new ObjectOutputStream(new DeflaterOutputStream(socket.getOutputStream()));
            this.input = new ObjectInputStream(new InflaterInputStream(socket.getInputStream()));
        }
    
        public void send(Serializable obj) throws IOException {
            output.writeObject(obj);
            output.reset();
            output.flush();
        }
    
        public <T extends Serializable> T receive() throws IOException, ClassNotFoundException {
            return (T) input.readObject();
        }
    
        @Override
        public void close() throws IOException {
            output.close();
            input.close();
            socket.close();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-19
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多