Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как остановить ServerSocket без выбрасывания исключений? / 4 сообщений из 4, страница 1 из 1
30.09.2018, 18:26
    #39710595
Lestat666
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить ServerSocket без выбрасывания исключений?
Код сервера:


Код: 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.
package server;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Server {

        private BufferedReader br = new BufferedReader (new InputStreamReader (System.in));
        private static ExecutorService executeIt = Executors.newFixedThreadPool(5);
        private Socket client;


        public static void main (String [] args) {
            Server server = new Server();
            server.go();
        }

        public void go () {

            try {               
                ServerSocket server = new ServerSocket (3345);

                Thread t = new Thread (new ServerCheck(server)) ;
                t.start();

                System.out.println("connection accepted");
                System.out.println("DataInputStream and DataOutputStream created");

                while (!server.isClosed()) { 

                    System.out.println("Server reading from channel");                
                    client = server.accept();
                    executeIt.execute(new MonoThreadClientHandler(client));
                    System.out.println("Connection accepted."); 
                }                
            }
            catch (Exception e) {
                e.printStackTrace();
            } 
        }


    public class ServerCheck implements Runnable  {
        ServerSocket sc;
        public ServerCheck (ServerSocket sc) {
        this.sc=sc;
    }            
    @Override
    public void run() {
        try {
            if (br.readLine().equalsIgnoreCase("exit"))
                br.close();
                sc.close();                
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
    }

}

}





При выполнении ServerSocket.close() вылетает исключение:
java.net.SocketException: socket closed

в строке:
client = server.accept();

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

Как правильно обойти это исключение и завершить работу сервера?
...
Рейтинг: 0 / 0
30.09.2018, 20:43
    #39710646
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить ServerSocket без выбрасывания исключений?
Как обычно - "перехватить и обработать".
...
Рейтинг: 0 / 0
30.09.2018, 21:50
    #39710659
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить ServerSocket без выбрасывания исключений?
Скорее всего - нормальное поведение. Клиент уже закрыл сокет и сервер при закрытии получает такое состояние.
Как обойти? Ну как всегда. Обработать.

Здесь не в тему топика. Это ужасный код. Никогда так не пишите.
У читающего будет когнитивное искажение. Его глаза и его мозг
будут кричать о том что sc.close вложен в if () {} хотя на самом деле
это не так.
Lestat666
Код: java
1.
2.
3.
            if (br.readLine().equalsIgnoreCase("exit"))
                br.close();
                sc.close();
...
Рейтинг: 0 / 0
01.10.2018, 14:20
    #39710941
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как остановить ServerSocket без выбрасывания исключений?
maytonКлиент уже закрыл сокет и сервер при закрытии получает такое состояние.
У него серверный слушающий сокет. Нет клиента.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как остановить ServerSocket без выбрасывания исключений? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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