У меня есть Java отдельная программа, которая подключается к потоку веб-сокетов и анализирует данные веб-сокетов. Есть пара сообщений, которые я отправил на серверный компонент. Серверный компонент не принадлежит мне. Ниже приведен код.
public class Test {
public static WebSocketClient mWs;
public static void main(String[] args) {
try {
mWs = new WebSocketClient(new URI("ws://mydomain.in/IBT/socket"), new Draft_6455()) {
@Override
public void onMessage(String message) {
parseMessage(message);
}@Override
public void onOpen(ServerHandshake handshake) {
System.out.println("opened connection");
}
@Override
public void onClose(int code, String reason, boolean remote) {
System.out.println("closed connection" + reason);
}
@Override
public void onError(Exception ex) {
ex.printStackTrace();
}
};
mWs.connect();
while (!mWs.isOpen()) {
Thread.sleep(2000);
}
mWs.send("{'MESSAGE WITH PARAMS'}");
} catch (
Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*
* @param pMessage
*/
public static void parseMessage(String pMessage) {
String decoded = new String(Base64.getDecoder().decode(pMessage));
Inflater inflater = new Inflater();
inflater.setInput(decoded.getBytes());
byte[] result = new byte[2048];
try {
int resultLength = inflater.inflate(result);
pMessage = new String(result, 0, resultLength, "UTF-8");
System.out.println(pMessage);
if (pMessage != null && !pMessage.trim().isEmpty()) {
JSONParser parser = new JSONParser();
JSONArray json = (JSONArray) parser.parse(pMessage);
String acknowledge = (String) ((JSONObject) json.get(0)).get("ak");
if (acknowledge != null && acknowledge.equalsIgnoreCase("ok")) {
mWs.send("{'MESSAGE WITH PARAMS'}");
}
}
} catch (DataFormatException | UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
inflater.end();
}
}
При выполнении этого я получаю три разные ошибки, основанные на сообщениях, поступающих с сервера веб-сокетов. при разборе. Все на этой линии
`int resultLength = inflater.inflate(result);`
**java.util.zip.DataFormatException: too many length or distance symbols**
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:259)
at java.util.zip.Inflater.inflate(Inflater.java:280)
at com.codespine.util.Test.parseMessage(Test.java:67)
**java.util.zip.DataFormatException: invalid distance too far back**
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:259)
at java.util.zip.Inflater.inflate(Inflater.java:280)
at com.codespine.util.Test.parseMessage(Test.java:67)
**java.util.zip.DataFormatException: invalid bit length repeat**
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:259)
at java.util.zip.Inflater.inflate(Inflater.java:280)
at com.codespine.util.Test.parseMessage(Test.java:67)
Я попробовал несколько решений, представленных здесь. Сначала попробовал использовать фиктивную длину, добавленную в конце. Но это не сработало. Кроме того, я не смог успешно реализовать преобразование байтового массива в байтовый поток ввода, как цитировалось на некоторых форумах. Я считаю, что должно работать, но не уверен, как этого добиться. Потому что там тоже нужно писать (byte [], int, int).