В соккет отправляются данные, размер одного пакета который может передать 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();
}
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
С недавнего времени решил познать работу с JSON, собственно при парсинге
есть таблица где напротив каждой строки есть кнопка удалитьнужно использовать ajax чтобы обновлялась таблица с убранной строкой
Web-приложение развернуто на TomcatПроблема такова у некоторого количества пользователей плохой интернет, томкат сбрасывает соединение у таких...
Суть вопроса такова: как будет лучше для браузера, поисковика, кода и вообще в целом, как лучше вставлять мелкие элементы - как картинку или...