Android: распаковка gzip с сокетом - PullRequest
0 голосов
/ 10 сентября 2018

Сценарий

Я использую функцию sendRequest для получения ответа от веб-сервера на конкретный запрос, сделанный из приложения Android, через сокетное соединение.

gzipсжатые данные отправляются с WebServer в мое приложение для Android.Но я не могу распаковать данные gzip на Android.

Если WebServer не передает данные gzip, args[0] возвращает желаемый вывод, необходимый моей программе.

В противном случае при передачеgzip данные с WebServer, я получаю ...во и ��ргуме... в качестве значения для args[0] на стороне Android.

И я не могу получить значение для finalSting

Myфайл gradle:

implementation ('io.socket:socket.io-client:1.0.0')

Вопрос

Как распаковать gzip в пределах подтверждения в socket.emit?

Есть ли другой способ распаковатьgzip на основе моего senario?

Socket.IO 1.4.0 и выше имеет такие функции, как автоматическое сжатие, это также относится и к Android?

В следующем коде я не могучтобы получить значение finalSting

public void sendRequest(JSONObject request, final SocketCallBack callback) {
    if( !socket.connected() )
    {
        if( callback != null )
            callback.doAction("");

        return;
    }
    socket.emit("socket_request", request, new Ack() {
        @Override
        public void call(Object... args) {
            Log.d(Const.HOTLYNC, "Send ACK = " + args.toString());
            if( args != null && args.length > 0 )
            {
                if( args[0] instanceof String && callback != null ) {
                    try {
                        String finalSting = decompress(convertToBytes(args[0]));

                        callback.doAction(finalSting);


                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            else
            {
                if( callback != null )
                    callback.doAction("");
            }
        }
    });
}

@TargetApi(Build.VERSION_CODES.KITKAT)
private byte[] convertToBytes(Object object) throws IOException {
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutput out = new ObjectOutputStream(bos)) {
        out.writeObject(object);
        return bos.toByteArray();
    }
}

public static String decompress(byte[] compressed) throws IOException {
    final int BUFFER_SIZE = 32;

    ByteArrayInputStream is = new ByteArrayInputStream(compressed);
    GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE);
    byte[] data = new byte[BUFFER_SIZE];
    int bytesRead=0;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    while ((bytesRead = gis.read(data)) != -1) {
        baos.write(data, 0, bytesRead);
    }
    gis.close();
    is.close();
    return baos.toString("UTF-8");
}
...