powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение пользовательского ввода из сокета
8 сообщений из 8, страница 1 из 1
Чтение пользовательского ввода из сокета
    #40085971
NullPointer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробую написать простенькую клиент-серверную штуку и понял, что совсем не знаю как работать с сокетами.

Пишу серверную часть, имею Socket с установленным соединением.

Хочу получить пользовательский посимвольный ввод с внешней стороны - пользователь подключен через telnet.

Соответственно, со своей серверной стороны хочу обрабатывать InputStream от сокета:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    @SneakyThrows
    private String readLine(InputStream inputStream) {
        int i = 0;

        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

        StringBuilder sb = new StringBuilder();

        while((i = br.read()) != -1){
            char c = (char) i;
            if (c == '\n')
                break;
            
            sb.append(c);
        }

        return sb.toString();
    }




Падает с эксепшеном:
Exception in thread "Thread-14" java.net.SocketTimeoutException: Read timed out

И, в принципе, логично. У сокета есть таймаут, если клиент за это время ничего не натыкал клавишами в телнете, соединение должно отвалиться.

Вопрос, как в подобном случае сделать получение символов с ожиданием ввода?
...
Рейтинг: 0 / 0
Чтение пользовательского ввода из сокета
    #40085972
Этот таймаут можно контролировать, например, установить в 1 час:
Код: java
1.
2.
3.
        ServerSocket s = new ServerSocket(8080);
        Socket connection = s.accept();
        connection.setSoTimeout(60*60*1000);

Если мы работаем с каким-то сервисом, то конечно этот таймаут должен быть небольшим. Но если это пользовательский ввод, то его нужно увеличить.

Клиентская программа при этом может либо показывать пользователю ошибку, либо автоматически стартовать соединение заново.

PS: у BufferedReader'a есть readLine(), твой метод можно оформить проще:
Код: java
1.
2.
3.
4.
    private static String readLine(InputStream inputStream) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        return br.readLine();
    }
...
Рейтинг: 0 / 0
Чтение пользовательского ввода из сокета
    #40086350
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NullPointer

Падает с эксепшеном:
Exception in thread "Thread-14" java.net.SocketTimeoutException: Read timed out

И, в принципе, логично. У сокета есть таймаут, если клиент за это время ничего не натыкал клавишами в телнете, соединение должно отвалиться.

Вопрос, как в подобном случае сделать получение символов с ожиданием ввода?


Насколько я помню у сокета 30 секунд таймаут для веб клиента через браузер. Эта вещь ни чем не лечится. Народ просто тупо каждые 10-20 секунд пингует коннекшин чтоб не упал. Как дело обстоит с телнет не знаю. Но замечу этот момент можно поискать на том же стековерфло так как тема злободневная.

Удачи
...
Рейтинг: 0 / 0
Чтение пользовательского ввода из сокета
    #40086374
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergunka,

30 минут.
...
Рейтинг: 0 / 0
Чтение пользовательского ввода из сокета
    #40086441
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergunka
NullPointer

Падает с эксепшеном:
Exception in thread "Thread-14" java.net.SocketTimeoutException: Read timed out

И, в принципе, логично. У сокета есть таймаут, если клиент за это время ничего не натыкал клавишами в телнете, соединение должно отвалиться.

Вопрос, как в подобном случае сделать получение символов с ожиданием ввода?


Насколько я помню у сокета 30 секунд таймаут для веб клиента через браузер. Эта вещь ни чем не лечится. Народ просто тупо каждые 10-20 секунд пингует коннекшин чтоб не упал. Как дело обстоит с телнет не знаю. Но замечу этот момент можно поискать на том же стековерфло так как тема злободневная.

Удачи


в firefox оно правится с помощью about:config я помню проверял там было чтото такое. Вроде 3 мин было, может поменяли уже с того момента времени много прошло. Наверняка и keep-alive default timeout value как то регулируется в настройках.

Но тут может быть сложее nginx тоже настраивается read, write timeout там что соединение может рваться с двух сторон.
...
Рейтинг: 0 / 0
Чтение пользовательского ввода из сокета
    #40086446
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для java время сессии для вэб задаётся на сервере . по умолчанию 30 минут, можно менять из кода, можно продлять.
как для телнета - хз.
...
Рейтинг: 0 / 0
Чтение пользовательского ввода из сокета
    #40086455
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя
для java время сессии для вэб задаётся на сервере . по умолчанию 30 минут, можно менять из кода, можно продлять.
как для телнета - хз.


сессия и сокет не совсем одно и тоже
...
Рейтинг: 0 / 0
Чтение пользовательского ввода из сокета
    #40086468
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сокет и веб-сокет - тоже совсем разные.

И таймаут у первого - настраивается программно.
https://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setSoTimeout(int)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение пользовательского ввода из сокета
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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