Сценарий
Я использую функцию 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");
}