powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Сокеты. Разделение данных на пакеты.
13 сообщений из 13, страница 1 из 1
Сокеты. Разделение данных на пакеты.
    #38324933
mre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mre
Гость
Отправляю данные по сокету.
Код: java
1.
socketChannel.write(buffer);


Если сделать несколько таких отправок в течение короткого промежутка времени, то данные могут прийти на клиент в одном пакете. Либо, если размер данных большой, они разбиваются на несколько пакетов.
Как сделать, чтобы данные уходили полностью после вызова write, не объединялись в пакеты и не разбивались?
Проблема в том, что данные сжимаются GZIP-ом перед отправкой и когда приходят на клиент их нужно распаковать, но если приходят несколько склеенных GZIP-ов, или разбитых, то распакуется криво.
...
Рейтинг: 0 / 0
Сокеты. Разделение данных на пакеты.
    #38324937
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Сокеты. Разделение данных на пакеты.
    #38324984
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mreКак сделать, чтобы данные уходили полностью после вызова write, не объединялись в пакеты и не разбивались?
Никак. Это пакетная передача данных. На передающей стороне надо проверять, сколько ушло и при необходимости передавать остаток, на приемной стороне проверять, сколько пришло и при необходимости читать дальше.
...
Рейтинг: 0 / 0
Сокеты. Разделение данных на пакеты.
    #38324985
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mreКак сделать, чтобы данные уходили полностью после вызова write, не объединялись в пакеты и не разбивались?В рамках вашей задачи - close, но не надо так делать.Проблема в том, что данные сжимаются GZIP-ом перед отправкой и когда приходят на клиент их нужно распаковать, но если приходят несколько склеенных GZIP-ов, или разбитых, то распакуется криво.gzip - потоковый алгоритм, у него в принципе нет проблем ни с получением блока по частям ни со склейкой нескольких блоков в один.
Что передаёте? Именно поток данных или, всё-таки, жмёте отдельные файлы?
...
Рейтинг: 0 / 0
Сокеты. Разделение данных на пакеты.
    #38325102
mre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mre
Гость
Basil A. Sidorov,

Строку - XML.
Если приходят 2 сжатых XML в одном пакете, при распаковке GZIP, получается только первая.
Раньше передавались просто XML с разделителем, по которому я и мог объединять/разделять их. То есть, если XML пришла не полная, жду пока придет символ конца.
Потребовалось сжимать данные, потому встала такая проблема.
...
Рейтинг: 0 / 0
Сокеты. Разделение данных на пакеты.
    #38325128
mre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mre
Гость
То есть, по идее, если я 2 строки запаковал gzip и отправил одним куском данных, то при распаковке, он сам объединит их в один, и на выходе должны получиться просто 2 склеенных строки?
...
Рейтинг: 0 / 0
Сокеты. Разделение данных на пакеты.
    #38325351
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mreРаньше передавались просто XML с разделителем, по которому я и мог объединять/разделять их. То есть, если XML пришла не полная, жду пока придет символ концаТогда close() на передающей стороне и повторный сеанс связи.

P.S. Не очень понятно, что мешает просто читать поток данных, не навешивая обработку там, где этого можно не делать?
...
Рейтинг: 0 / 0
Сокеты. Разделение данных на пакеты.
    #38325364
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий случай перечитал GZIPInputStream.html .
Так и не понял, что мешает работать "как раньше", просто надстроив входной поток распаковщиком?
...
Рейтинг: 0 / 0
Сокеты. Разделение данных на пакеты.
    #38325421
mre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mre
Гость
Метод отправки выглядит так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public static void send(Socket socket, String data)
{
	byte[] bytes;
	SocketChannel socketChannel = socket.getChannel();
	ByteArrayOutputStream zippedDataOS = new ByteArrayOutputStream();
	GZIPOutputStream os;
	os = new GZIPOutputStream(zippedDataOS);
	os.write(data.getBytes(Charset.forName("utf-8")));
	os.close();
	bytes = zippedDataOS.toByteArray();
	ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
	buffer.put(bytes);
	buffer.flip();
	socketChannel.write(buffer);
}



Если здесь все ок, то возможно проблема в чтении на клиенте, там не ява.
...
Рейтинг: 0 / 0
Сокеты. Разделение данных на пакеты.
    #38325438
goalinternet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mre,

Возьмите apache mina , там для пакетирования есть одна встроенная вещь, это когда первые 2 или 4 байта в пакете, содержать длину пакета. Очень удобная вещь (для меня по крайней мере).

Мина для того чтоб не играться самому с сокетами.
...
Рейтинг: 0 / 0
Сокеты. Разделение данных на пакеты.
    #38325594
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Протестировал сжатие строк (java test > файл.gz) на таком классе:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.util.zip.GZIPOutputStream;
public class test {
  public static void main(String[] args) throws java.io.IOException {
    OutputStreamWriter gzOut = new OutputStreamWriter(new GZIPOutputStream(System.out));
    StringReader strIn = new StringReader(args[0]);
    int i;
    while ( (i = strIn.read()) > -1 ) gzOut.write(i);
    gzOut.close();
  }
}

Соответственно, ваш вариант я бы переписал (значимая часть, без проверки) как:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Socket sock = new Socket();
  OutputStreamWriter gzOut =
    new OutputStreamWriter(
      new GZIPOutputStream(
        sock.getOutputStream()
      )
    );
StringReader strIn = new StringReader(data, "UTF-8");
int i;
while ( (i = strIn.read()) > -1 ) gzOut.write(i);
gzOut.close();

Второй вариант - записать в сокет данные из gz-файла с нужным содержимым, чтобы исключить "ту сторону".
...
Рейтинг: 0 / 0
Сокеты. Разделение данных на пакеты.
    #38332042
mre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mre
Гость
Проблема все-таки в клиенте.
Приходит 3 архива в одном пакете, но распаковывается только первый, буду искать как вытащить остальные.
...
Рейтинг: 0 / 0
Сокеты. Разделение данных на пакеты.
    #38334346
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно использовать UDP, тогда пакеты ходят как есть, но могут потеряться )
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Сокеты. Разделение данных на пакеты.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]