сокет Java, отправляющий сжатый объект - PullRequest
0 голосов
/ 13 октября 2018

Я хочу сжать мои сериализуемые объекты и отправить их через сокеты 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: не в формате GZIP на стороне получателя.

Я не буду закрывать потоки и сокеты, потому что нужно отправить несколько объектов, используя один и тот же поток игнездо (с точки зрения производительности)

1 Ответ

0 голосов
/ 13 октября 2018

ObjectStream - один из самых подробных доступных форматов сериализации.Примерно любая другая сериализация будет лучше по размеру.ObjectStreams должны быть сброшены для отправки всех данных, и вы не можете отправить более одного потока в соединении, что делает неэффективным просто отправку одного объекта на соединение.

Сжатые потоки работают лучше всего для больших объемов данных,когда вы пытаетесь применить их к нескольким байтам, результат будет больше, а не меньше.Сжатые потоки должны быть сброшены для чтения.

необходимо отправить несколько объектов, используя один и тот же поток и сокет (с точки зрения производительности)

Это означает, что вы должны сохранить свой GZIPОбъектные потоки.Вы не можете использовать более одного на поток.

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...