Разбор потоковых данных Websocket с использованием Inflater и WebSocketClient - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...