Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/47: Рейтинг темы: голосов - 47, средняя оценка - 4.74
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111

Java.net.SocketException: Connection reset при обработке события кнопки

05.08.2018, 19:47. Показов 9721. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Разбираюсь с логикой работы клиента и сервера. Вот такой вопрос возник. Есть сервер, который выбирает из файла случайную строку и по запросу отправляет клиенту. Запрос делается по нажатию кнопки в клиенте. Все просто. Но вылетает исключение java.net.SocketException: Connection reset. Стэк указывает на обработчик события кнопки. Вот код:
(сервер)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class AphorismServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(1234);
        System.out.println("Сервер стартовал");
        try {
            while (true) {
                Socket incoming = server.accept();
                System.out.println("Соединение установлено");
                Runnable r = new ThreadedHandler(incoming);
                Thread t = new Thread(r);
                t.start();
            }
        } finally {
            server.close();
        }
 
    }
}
(обработчик запроса клиента)
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
30
31
32
33
34
35
36
37
38
39
40
41
public class ThreadedHandler implements Runnable
{
    private String file = "aphorism.txt";
    private int count;
    Socket incoming;
    Scanner in = new Scanner(incoming.getInputStream());
    DataOutputStream out = new DataOutputStream(new BufferedOutputStream(incoming.getOutputStream()));
    RandomAccessFile raf = new RandomAccessFile(file,"r");
    Random rand = new Random();
 
    public ThreadedHandler(Socket incoming) throws IOException {
        this.incoming = incoming;
    }
    private String getAphorism() throws IOException {
        String line="";
        while ((raf.readLine())!=null)
            count++;
        int randomPos = rand.nextInt(count-1);
        int i=0;
        raf.seek(0);
        while (i!=randomPos+1)
        {
            line = raf.readLine();
            i++;
        }
        return line;
    }
    @Override
    public void run()
    {
        try {
            if (in.nextLine().equals("get")) {
                out.writeUTF(getAphorism());
                out.flush();
            }
            }catch(IOException e)
            {
                e.printStackTrace();
            }
    }
}
(клиент)
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
30
31
32
33
34
35
36
37
38
39
40
public class AphorismClient extends Application{
 
    Label label;
    Button button;
    VBox vBox = new VBox();
 
    public AphorismClient() throws IOException {
    }
 
    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane pane = new BorderPane();
        Scene scene = new Scene(pane, 300,400);
        label = new Label();
        button = new Button("click me");
        pane.setCenter(label);
        pane.setBottom(button);
        Socket socket = new Socket("localhost",1234);
        DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
        DataInputStream input = new DataInputStream(socket.getInputStream());
        button.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                try
                {
                    out.writeUTF("get");
                    String aphorism = input.readUTF();
                    label.setText(aphorism);
                } catch (IOException e)
                {
                    e.printStackTrace();
                }
        }
                });
        primaryStage.setScene(scene);
        primaryStage.show();
 
 
    }
}
Добавлено через 5 минут
Для ясности я отправляю серверу текстовое сообщение, по которому вызывается метод, генерирующий строку.
В исключении указывается строка 27 клиента. Искал инфу в инете по этому исключению, но так, честно говоря, и не понял, что мне с этим делать. Помогите пожалуйста разобраться. Спасибо!

Добавлено через 7 часов 34 минуты
Выяснилось, что дело не самом обработчике кнопки. А в том, что строка из файла не отправляется. Я это выяснил, когда вместо потока DataIputStream попытался использовать Scanner.nextLine(). Появилось сообщение, что строка отсутствует... Но почему? Метод getAphorism() рабочий, проверено.

Добавлено через 13 минут
Но оказалось, что и не методе дело... Не передается даже простое сообщение. В чем все-таки дело? Где собака зарыта?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.08.2018, 19:47
Ответы с готовыми решениями:

Netty exceptions (java.net.BindException, Connection reset by peer)
Привет. У меня возникла такая проблема. На клиенте при отправке сообщений с большой нагрузкой возникает java.net.BindException:...

java.net.SocketException
Помогите разобраться с проблемкой java.net.SocketException: No buffer space available (maximum connections reached?): connect at...

Java.net.SocketException: помогите
javax.servlet.ServletException: Communication link failure: java.net.SocketException: SELECT * FROM tableName at...

12
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
06.08.2018, 16:07  [ТС]
Так и не получил ни одного ответа. Наверно выходные сказались). Решил пойти от простого к сложного, чтобы понять причину исключения. Немного изменил код клиента и сервера,но в принципе все то же. И получил исключение при попытке записи текста из потока Scanner в Label. Погуглил, нашел инфу, что якобы изменять элементы интерфейса во время работы программы можно только из потока JavaFX и нужно использовать Platform.runLater(). Но не помогло... Нужна ваша помощь).
Клинет:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
public class ClientTest extends Application {
    Socket socket;
    Scanner input;
    DataOutputStream out;
    Stage window;
    Scene scene;
    BorderPane pane;
    Label aphorism;
    Button button;
    VBox layout;
 
 
    public ClientTest() throws IOException {
    }
 
    @Override
    public void start(Stage primaryStage) throws Exception {
        window = primaryStage;
        pane = new BorderPane();
        aphorism = new Label();
        button = new Button("Click me");
        button.setOnAction(event ->
        {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    aphorism.setText(getAphorism());
                }
            });
 
        });
        layout = new VBox(20);
        layout.getChildren().addAll(aphorism, button);
        pane.setCenter(layout);
 
        try
        {
        startClient();
 
        }finally {
            closeClient();
        }
        scene = new Scene(pane,600,200);
        window.setScene(scene);
        window.show();
    }
 
    private void startClient() throws IOException {
        connectToServer();
        setupStreams();
    }
 
    private void connectToServer()
    {
        try {
            System.out.println("Подключаемся к серверу...");
            socket = new Socket("localhost", 1234);
            System.out.println("Установлено соединение с: " + socket.getInetAddress().getHostName());
        }
        catch (ConnectException connectException){
            System.err.println("Сервер не найден");
        }
        catch (IOException ioException){
            ioException.printStackTrace();
        }
    }
 
    private void setupStreams() throws IOException
    {
        out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
        input = new Scanner(socket.getInputStream(),"UTF-8");
    }
 
    private void closeClient() throws IOException
    {
        out.close();
        input.close();
        socket.close();
    }
 
    private void whileSession(){
        String text = input.nextLine();
        System.out.println(text);
    }
    private String getAphorism()
    {
        String text = input.nextLine();
        return text;
    }
 
    public static void main(String[] args) throws IOException {
        launch(args);
    }
}
Вот стэктрэйс:
Exception in thread "JavaFX Application Thread" java.lang.IllegalStateException: Scanner closed
at java.util.Scanner.ensureOpen(Scanner.jav a:1070)
at java.util.Scanner.findWithinHorizon(Scan ner.java:1670)
at java.util.Scanner.nextLine(Scanner.java: 1538)
at ClientTest.getAphorism(ClientTest.java:1 03)
at ClientTest.access$000(ClientTest.java:17 )
at ClientTest$1.run(ClientTest.java:43)
at com.sun.javafx.application.PlatformImpl. lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivile ged(Native Method)
at com.sun.javafx.application.PlatformImpl. lambda$runLater$173(PlatformImpl.java:29 4)
at com.sun.glass.ui.InvokeLaterDispatcher$F uture.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._run Loop(Native Method)
at com.sun.glass.ui.win.WinApplication.lamb da$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
06.08.2018, 18:16
Njula, не читал, но осуждаю но вроде тебе пишет, что сканнер уже закрыт в методе гетАфоризм
сделал усилие и код посмотрел, не очень внимательно:
а) перед юзанием сканнера в методе убедись, хотя бы что хэзНекст()
б) разве в 38 и 41 строке ты не открываешь и тут же закрываешь клиент (в том числе и сканнер его) ?
1
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
07.08.2018, 14:27  [ТС]
Спасибо, уважаемый Welemir1! За ответ и за усилие, приложенное для просмотра моего далекого от совершенства кода). За что же меня осуждаете? Я только учусь, бывает беру код из разных примеров, пытаюсь применить, осмыслить. Не всегда получается. Действительно закрытие сканера и клиента было не к месту. Также нужно было внести создание Random rand в тело метода getAphorism(), тут тоже нашлась ошибка, все-таки он не работал. Вот последняя реинкарнация моего кода (сделал как можно проще):
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class Server {
 
    ServerSocket server;
    Socket income;
    PrintWriter out;
    Scanner in;
    RandomAccessFile raf;
    private String file;
    private int count;
 
    public void startServer() throws IOException {
        server = new ServerSocket(1234);
        System.out.println("Ждем подключения...");
        income = server.accept();
        while (true) {
            out = new PrintWriter(income.getOutputStream());
            out.println(getAphorism());
            out.flush();
        }
    }
    private String getAphorism() throws IOException {
        file = "aphorism.txt";
        Random rand = new Random();
        raf = new RandomAccessFile(file,"r");
        String line="";
        while ((raf.readLine())!=null)
            count++;
        int randomPos = rand.nextInt(count-1);
        int i=0;
        raf.seek(0);
        while (i!=randomPos+1)
        {
            line = raf.readLine();
            i++;
        }
        return line;
    }
 
    public static void main(String[] args) throws IOException {
        Server server = new Server();
        server.startServer();
    }
}
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
30
31
32
33
34
35
36
37
public class Client extends Application{
    Socket socket;
    Scanner in;
    PrintWriter out;
    String text;
    Stage window;
    Scene scene;
    BorderPane pane;
    Label aphorism;
    Button button;
    VBox layout;
 
    @Override
    public void start(Stage primaryStage) throws Exception {
        socket = new Socket("localhost",1234);
        in = new Scanner(socket.getInputStream(),"UTF-8");
        text = in.nextLine();
        out = new PrintWriter(new BufferedOutputStream(socket.getOutputStream()));
        window = primaryStage;
        pane = new BorderPane();
        layout = new VBox(20);
        aphorism = new Label();
        button = new Button("Click me");
        button.setOnAction(event ->{
                aphorism.setText(text);});
        layout.getChildren().addAll(aphorism, button);
        pane.setCenter(layout);
        scene = new Scene(pane, 500,200);
        window.setScene(scene);
        window.show();
 
    }
 
    public static void main(String[] args) throws IOException {
        launch(args);
    }
}
Пока без закрытия потоков, думаю, их надо закрывать по закрытию основного окна. Позже обработчик напишу. Исключений нет, но... Текст по нажатию кнопки выдается только один раз. Повторные нажатия ни к чему не приводят.Как это исправить? Я так понимаю, при нажатии идет обращение к входящему потоку, в которые сервер записывает в цикле строки из файла. Во всяком случае, так должно быть... И снова надеюсь на вашу помощь. Ваши советы Welemir1 несомненно очень ценны. А если вдруг на вопросы здесь перестанут отвечать, придется наверно идти учиться на какой-нибудь JavaRush. Не надо...)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
07.08.2018, 14:48
Цитата Сообщение от Njula Посмотреть сообщение
За что же меня осуждаете?
да это шутка такая) мол я Пастернака не читал но осуждаю
пока читать твой код нет сил, тут на работе насмотришься))) обязательно читай местную статью про дебаггер!
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
07.08.2018, 21:11  [ТС]
Обязательно почитаю)

Добавлено через 5 часов 58 минут
Debug хорошая штука. Он помог мне найти ошибку. Счетчик count нужно обнулять. И улучшить алгоритм. В целом работа программы как на ладони. Но здесь связка сервер-клиент... Да, сервер после первой итерации получает строку и, когда она отправляется в исходящий поток появляется окно. Нажимаешь кнопку, текст появляется. Дальше жму F7 и снова переход в метод выбора строки. После чего к отправке, отправляется. Естественно ничего не открывается, окно открыто. Нажимаешь кнопку - ничего. Вот подскажите в чем тут дело?) Подозреваю, что все очень просто, но хоть убей)...
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
08.08.2018, 05:55
Njula, ой-вей, тут много в чем может быть дело:
1) посмотри дебаггером -после нового нажатия происходит то, что должно происходить за кулисами?
2) ты вот про это?
Цитата Сообщение от Njula Посмотреть сообщение
button.setOnAction(event ->{
* * * * * * * * aphorism.setText(text);});
так он правильно не меняется, переменная текст то не изменилась. или ты ее меняешь?
3) возможно нужно перерисовывать элемент
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
08.08.2018, 13:28  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
1) посмотри дебаггером -после нового нажатия происходит то, что должно происходить за кулисами?
- да в общем, после нажатия кнопки при дебаге сервера не происходит ничего, совсем. Дебаг клинета не задался) - при создании окна pane = new BorderPane() дебаг уходит в перебор методов 8 классов и с концами...
Цитата Сообщение от Welemir1 Посмотреть сообщение
так он правильно не меняется, переменная текст то не изменилась. или ты ее меняешь?
-
вот...тут видимо кроется мое непонимание. Я полагаю, что при при нажатии кнопки раз за разом происходит обращение к входящему потоку, в который сервер в цикле посылает разные строки. Как-то так. Но видимо все иначе происходит. Хотелось бы понять эту логику.
Цитата Сообщение от Welemir1 Посмотреть сообщение
3) возможно нужно перерисовывать элемент
- requestLayout() для Label не помогло.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
08.08.2018, 14:26
Цитата Сообщение от Njula Посмотреть сообщение
Я полагаю, что при при нажатии кнопки раз за разом происходит обращение к входящему потоку, в который сервер в цикле посылает разные строки.
может туплю, но не вижу где это реализовано, вижу то по нажатию ты просто ставишь новый текст в афоризм (элемент)
попробуй те строки что нужны присваивать переменной статик и в листенере именно эту статик переменную присваивать в текстовое поле
1
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
08.08.2018, 14:32  [ТС]
)) Спасибо! Конечно! У меня так и было изначально, не работало, но по другой причине. И тогда я ввел эту переменную text. Вернул вызов метода получения строки в аргумент и все заработало!!! Спасибо!
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
08.08.2018, 14:34
Njula, все ж для тебя
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
08.08.2018, 14:53  [ТС]
Все, да не все). Афоризмы меняются при нажатии. Написал обработчик закрытия окна
Java
1
2
3
4
5
6
7
8
9
10
window.setOnCloseRequest(e->{
                out.close();
                in.close();
                    try {
                        socket.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
        );
Закрываю, сервер продолжает работать. Так в принципе и должно быть. Ждет подключений. Снова запускаю клиент и... он зависает. Что ж такое?)

Добавлено через 1 минуту
Ну, спасибо, Wlemir1, чтобы я без ваших советов делал).

Добавлено через 9 минут
Если сервер остановить и снова все запустить - работает до закрытия окна.

Добавлено через 2 минуты
То есть, чтобы клиент работал, нужно перезапустить сервер.
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
09.08.2018, 21:53  [ТС]
Сделал все тоже самое, но только с многопоточным сервером и... клиент перестал зависать! Все работает! Wlemir1 - риспект).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.08.2018, 21:53
Помогаю со студенческими работами здесь

Java.net.SocketException: Socket closed
Пытаюсь реализовать механизм отключения клиентов от сервера. Возникает ошибка: java.net.SocketException: Socket closed at...

Connection refused: connect в java.net.Socket
\о Работая над сокетным чатом, столкнулся с такой проблемой: при Socket ss = new Socket(host, port); с SocketServer h = new...

Генерация события при обработке другого события
Привет!!!! помогите пожалуйста. Как генерировать событие нажатия кнопки при обработки события нажатия на другую кнопку private:...

В обработке события клика кнопки увеличить значение переменной на единицу
Всем привет ) Нужна помощь . Как сделать кнопку которая прибавляла бы к какой либо переменной 1 при каждом нажатии . В последствии эту...

SocketException: An existing connection was forcibly closed by the remote host
Всем доброго дня! Подскажите чайнику, в чём может быть дело. Есть WCF-сервис и клиент. Клиент вызывает сервис, тот делает некую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru