В чем ошибка в коде многопоточного сервера?

253
19 апреля 2017, 11:29

Код при запуске потоков-соединений (подсоединении клиентов) выдаёт ошибку "IOExceptionRunnable". Буду признателен любой подсказке.

Код сервера:

public class Chat_Server {
    public static final int port = 1235;
    public static ArrayList<ClientConnection> ClientConnections = new ArrayList<>();
    public static class ClientConnection extends Thread {
        private Socket Client;
        private BufferedReader in;
        private PrintWriter out;
        public ClientConnection(Socket s) throws IOException {
            this.Client = s;
            try {
                this.in = new BufferedReader(new InputStreamReader(Client.getInputStream()));
                this.out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(Client.getOutputStream())), true);
            } catch (IOException e) {
                System.err.println("IOExceptionInConstructor");
            } finally {
                in.close();
                out.close();
                Client.close();
            }
        }
        @Override
        public void run() {
            boolean Active = true;
            try {
                this.out.println("Добро пожаловать в локальный чат! Пожалуйста, введите Ваше имя:");
                String Nickname = in.readLine();
                for (ClientConnection c : ClientConnections) {
                    c.out.println(Nickname + " подключился!");
                    System.out.println(Nickname + " подключился");
                }
                String result = "";
                while (Active) {
                    result = this.in.readLine();
                    for (ClientConnection c : ClientConnections) {
                        if (result != null) c.out.println(Nickname + ":   " + result);
                        System.out.println(Nickname + ":    " + result);
                    }
                }
                for (ClientConnection c : ClientConnections) {
                    if (result == null) c.out.println(Nickname + " покинул чат!");
                    System.out.println(Nickname + " покинул чат!");
                }
            } catch (IOException e) {
                System.err.println("IOExceptionRunnable");
            } finally {
                try {
                    in.close();
                    out.close();
                    Client.close();
                } catch (IOException e) {
                    System.err.println("IOExceptionInClosing");
                }
            }
        }
    }
    public static void main(String[] args) throws IOException {
        ServerSocket SSocket = new ServerSocket(port);
        System.out.println("ServerSocket created...   " + SSocket);
        Socket ClientSocket = null;
        try {
            boolean Listening = true;
            while (Listening) {
                ClientSocket = SSocket.accept();
                System.out.println("Connected...   " + ClientSocket);
                try {
                    ClientConnection CLConn = new ClientConnection(ClientSocket);
                    ClientConnections.add(CLConn);
                    System.out.println("Connections:   " + ClientConnections.toString());
                    CLConn.start();
                    if (!CLConn.isAlive()) ClientConnections.remove(CLConn);
                } catch (IOException e) {
                    System.err.println("IOExceptionInListening");
                }
            }
        } catch (IOException e) {
            System.err.println("IOException");
        } finally {
            ClientSocket.close();
            System.out.println("Connection is closing...");
            SSocket.close();
            System.out.println("Closed...");
        }
    }
}

И код клиента:

public class Chat_Client {
    public static void main(String[] args) throws IOException {
        Socket ClientC = new Socket("127.0.0.1", 1235);
        BufferedReader inClient = new BufferedReader(new InputStreamReader(ClientC.getInputStream()));
        PrintWriter outClient = new PrintWriter(new BufferedWriter(new OutputStreamWriter(ClientC.getOutputStream())), true);
        Scanner inConsole = new Scanner(System.in);
        String Nickname = inConsole.nextLine();
        boolean Active = true;
        while (Active) {
            String result = inClient.readLine();
            System.out.println(Nickname + ":   " + result);
            String inC = inConsole.nextLine();
            outClient.println(inC);
        }
    }
}
Answer 1

Вы закрываете поток и потом пробуете из него читать. Соответсвенно получаете исключение. Если вы не собираетесь обрабатывать исключение, то хотя бы печатайте stack trace используя метод printStackTrace(). Тогда вам будет понятно где и что произошло.

Вот тут вы открываете потоки и тут же закрываете их в блоке finally.

try {
    this.in = new BufferedReader(new InputStreamReader(Client.getInputStream()));
    this.out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(Client.getOutputStream())), true);
} catch (IOException e) {
    System.err.println("IOExceptionInConstructor");
} finally {
    in.close();
    out.close();
    Client.close();
}

Переменные в java принято называть с маленькой буквы, пакеты тоже. Названия классов принято начинать с большой буквы и использовать CamelCase (а не подчеркивания). Константы принято писать полностью большими буквами.

READ ALSO
Проблема с закрытием курсора

Проблема с закрытием курсора

После этого в ListView передается курсор и на нем отображается содержимое курсора, но, если я закрываю курсор в конце, то в приложении выходит...

230
SOAP сервис и парсер [требует правки]

SOAP сервис и парсер [требует правки]

Я использую сервер tomcat и деплою на него мое grails приложениеУ меня не получилось найти нормальное решение на groovy (все плагины не работают, а разбираться...

309
Как прослушать порт, который already in use?

Как прослушать порт, который already in use?

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

264
Поиск по нескольким полям в Java

Поиск по нескольким полям в Java

Пишу программу на Java + PostgreSQLНужно сделать поиск по нескольким полям как на фото:

270