Дополучение данных из соккета

208
30 октября 2018, 03:00

В соккет отправляются данные, размер одного пакета который может передать Wi-Fi ограничен(данных может быть больше чем может передать WI-FI за раз). Например если сервер собрал пакет данных больше чем может передать Wi-fi модуль то этот пакет делиться на 2 или n пакетов.

А так-же может быть так что пакет делиться на 2 части - первая часть это начало пакета №1, а 2ая часть это конец пакета №1 и начало пакета №2.

p.s. В начале ПАКЕТА есть заголовки в которых есть данные о пакета, т.е. например какая должна быть длина данного пакета (например 115 байт) - я знаю длину пакета.

Подскажите, пожалуйста, как мне реализовать механизм который дополучил бы данные если длина полученных данных меньше чем размер указанный в заголовке пакета, а так-же необходимо из дополученных данных извлечь начало следующего пакета(если в дополученном пакете больше данных чем необходимо для доборо предыдущего пакета)

Пытался реализовать, но мой код не выполняет требуемые задачи.

try {
            InetAddress serverAddr = InetAddress.getByName(address);
            socket = new Socket();
            socket.bind(null);
            socket.connect(new InetSocketAddress(serverAddr, Constants.SERVER_PORT), 20000);
            mRun = true;
            if (socket.isConnected()) {
                Log.d(Constants.LOG_TAG, "connect socket!!!");
            } else {
                return;
            }
            mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8")), true);
            mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            sendMessage(Constants.START_DATA); // отправляем название команды
            sendMessage(TAG_CAN_ID_PGN);
            if (mMessageListener != null) mMessageListener.onConnected();
            //Буффер куда собираем данные
            ByteArrayOutputStream  byteArrayOutputStream = new ByteArrayOutputStream();
            // ждем ответа
            while (mRun) {
                if (Thread.currentThread().isInterrupted()) {
                    mRun = false;
                    Thread.currentThread().interrupt();
                    return;
                }
                if (mBufferOut.checkError()) {
                    mRun = false;
                }
                char[] inputChars = new char[1048 * 10];
                int dataCount = 0;
                while (true) {
                    int cc = mBufferIn.read(inputChars);
                    if (cc == -1) {
                        break;
                    }
                    byte[] buf = new BigInteger(new String(inputChars).substring(0, cc), 16).toByteArray();
                    if (buf[0] == 85 && buf[1] == 23) {
                        // начало пакета
                        dataCount = ByteBuffer.wrap(buf, 4, 2).getShort() & 0x3ff;
                        byteArrayOutputStream.write(buf);
                    } else {
                        // получили вторую порцию пакета
                        byteArrayOutputStream.write(buf);
                    }
                    if (byteArrayOutputStream.size() - 9 == dataCount){
                        parseData(ByteBuffer.wrap(byteArrayOutputStream.toByteArray()));
                        byteArrayOutputStream.reset();
                    }
                }
            }
        } catch (Exception e) {
            if (e instanceof InterruptedException) {
                Thread.currentThread().interrupt();
                return;
            }
            e.printStackTrace();
            Log.d(Constants.LOG_TAG, e.toString());
        } finally {
            Log.d(Constants.LOG_TAG, ":finally");
            if (socket != null) {
                stopClient();
                try {
                    socket.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
READ ALSO
Парсинг JSON с помощью библиотеки GSON JAVA

Парсинг JSON с помощью библиотеки GSON JAVA

С недавнего времени решил познать работу с JSON, собственно при парсинге

185
JSF + ajax обновление таблицы

JSF + ajax обновление таблицы

есть таблица где напротив каждой строки есть кнопка удалитьнужно использовать ajax чтобы обновлялась таблица с убранной строкой

155
Развертывание приложения на Tomcat

Развертывание приложения на Tomcat

Web-приложение развернуто на TomcatПроблема такова у некоторого количества пользователей плохой интернет, томкат сбрасывает соединение у таких...

188
Вопрос теоретический. Картинка или css код?

Вопрос теоретический. Картинка или css код?

Суть вопроса такова: как будет лучше для браузера, поисковика, кода и вообще в целом, как лучше вставлять мелкие элементы - как картинку или...

163