powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по записи стримов
5 сообщений из 5, страница 1 из 1
Вопрос по записи стримов
    #39079353
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаю данные из одного сокета и пишу в другой (типа реверс-прокси)
Когда оперирую буферами по 1 байту, то все нормально работает, но стоит увеличить, как клиенский софт перестает отвечать.
Так понимаю если я делаю read() то он не вернет результат, пока не наполнит буфер?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
            // подключение к ЛС
            DataOutputStream lsOs = new DataOutputStream(socket.getOutputStream());
            final DataInputStream lsIs = new DataInputStream(socket.getInputStream());
            // Клиент
            final DataOutputStream clientOs = new DataOutputStream(this.socket.getOutputStream());
            final DataInputStream clientIs = new DataInputStream(this.socket.getInputStream());

            new Thread(new Runnable() {
                @Override
                public void run() {
                    byte[] buffer = new byte[1];
                    try {
                        while(lsIs.read(buffer) != -1) {
                            System.out.println("server to client: " + new String(buffer));
                            clientOs.write(buffer);
//                            clientOs.flush();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();

            byte[] buffer = new byte[1];
            while (clientIs.read(buffer) != -1) {
                System.out.println("client to server: " + new String(buffer));
                lsOs.write(buffer);
//                lsOs.flush();
            }



Как правильно передавать данные из буфера в буфер в количестве больше чем 1 байт?

Код: java
1.
2.
3.
4.
5.
6.
7.
            byte[] buffer = new byte[64];
            int length;
            while ((length = clientIs.read(buffer)) != -1) {
                System.out.println("client to server: " + new String(buffer));
                lsOs.write(buffer, 0, length);
//                lsOs.flush();
            }



Так пробовал, но на клиенте софт который работает через этот тунель перестает работать.
...
Рейтинг: 0 / 0
Вопрос по записи стримов
    #39079392
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй способ работает, если размер буфера сделать 1024, почему не работает с меньшим?
...
Рейтинг: 0 / 0
Вопрос по записи стримов
    #39079407
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

а зачем тебе DataInputStream и DataOutputStream ?
...
Рейтинг: 0 / 0
Вопрос по записи стримов
    #39079416
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ни зачем, скопировал откуда то пример и не поменял.
...
Рейтинг: 0 / 0
Вопрос по записи стримов
    #39080082
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

Нужно использовать InputStream.available(). Если у вас пакет меньше чем размер буфера, то read() заблокируется, так как будет ждать наполнения буфера. При этом поток блокируется и не отправляет то что уже прочитано. Соответственно и другая сторона никак не реагирует, так как ждет сообщения, а оно себе лежит в массиве и никак не используется.

Но, если избавится от блокировок, то Java будет колбасить холостые циклы и жрать CPU. Нужно делать более хитрый цикл, если available() > 0, то читать в буфер, но не более чем available(). Если available() возвращает 0, то читать только 1 байт, чтобы заблокироваться до первого байта. Блин, почему я раньше так не догадался. Год назад делал похожее. В итоге переписал на NIO.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по записи стримов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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