Android:使用套接字进行gzip解压缩

时间:2018-09-10 20:50:38

标签: android socket.io gzip compression emit

场景

我正在使用sendRequest函数通过套接字连接从WebServer获取对Android App发出的特定请求的响应。

gzip压缩数据从WebServer发送到我的Android应用程序。但是我无法在Android上解压缩gzip数据。

如果WebServer不传递gzip数据,则args[0]返回我的程序所需的期望输出。

否则,当从Web服务器传递gzip数据时,我会将此...во и ��ргуме...作为Android端args[0]的值。

我无法获得finalSting

的值

我的gradle文件:

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

问题

如何在socket.emit的确认中解压缩gzip?

他们还有其他方法可以根据我的senario解压缩gzip吗?

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");
}

0 个答案:

没有答案