Код при запуске потоков-соединений (подсоединении клиентов) выдаёт ошибку "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);
}
}
}
Вы закрываете поток и потом пробуете из него читать. Соответсвенно получаете исключение. Если вы не собираетесь обрабатывать исключение, то хотя бы печатайте 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 (а не подчеркивания). Константы принято писать полностью большими буквами.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
После этого в ListView передается курсор и на нем отображается содержимое курсора, но, если я закрываю курсор в конце, то в приложении выходит...
Я использую сервер tomcat и деплою на него мое grails приложениеУ меня не получилось найти нормальное решение на groovy (все плагины не работают, а разбираться...
Мой сервер должен обрабатывать запросы от VK APIКак я понимаю, они идут на 80 порт только, но это основной порт, и отключить его слушателей я не могу
Пишу программу на Java + PostgreSQLНужно сделать поиск по нескольким полям как на фото: