Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по записи стримов / 5 сообщений из 5, страница 1 из 1
18.10.2015, 15:14
    #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
18.10.2015, 16:29
    #39079392
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по записи стримов
Второй способ работает, если размер буфера сделать 1024, почему не работает с меньшим?
...
Рейтинг: 0 / 0
18.10.2015, 17:02
    #39079407
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по записи стримов
Hett,

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

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

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


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