Валидатор принял у меня предыдущую задачу, но программа рушится сразу после ввода клиентом имени с сообщением "Произошла ошибка во время работы клиента".
Сервер при этом пишет "Установлено соединение с /127.0.0.1:64224
Произошла ошибка при обмене данными с удаленным адресом"
Пробую воспользоваться дебаггером, но что-то идёт не так и программа не останавливается на расставленных перед возникновением ошибки красных точках.
Please, help! Я уже перестал понимать, где ещё искать ошибку.
package com.javarush.task.task30.task3008;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class Server {
private static class Handler extends Thread {
private Socket socket;
private Handler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
Connection connection=null;
try {
ConsoleHelper.writeMessage("Установлено соединение с " + socket.getRemoteSocketAddress().toString());
connection = new Connection(socket);
String connectingName = serverHandshake(connection);
notifyUsers(connection, connectingName);
//5. Сообщать новому участнику о существующих участниках.
sendBroadcastMessage(new Message(MessageType.USER_ADDED, connectingName));
serverMainLoop(connection, connectingName);
connectionMap.remove(connectingName);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED, connectingName));
ConsoleHelper.writeMessage("Cоединение с удаленным адресом закрыто");
}
catch (Exception e) {
ConsoleHelper.writeMessage("Произошла ошибка при обмене данными с удаленным адресом");
try {
if (connection != null) {
connection.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
/*private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException {
connection.send(new Message(MessageType.NAME_REQUEST, "Превед, медвед. Как звать?"));
Message reply = connection.receive();
String name = reply.getData();
if (reply.getType() == MessageType.USER_NAME) {
if (!connectionMap.containsKey(name)&&!name.equals("")) {
connectionMap.put(name, connection);
connection.send(new Message(MessageType.NAME_ACCEPTED, "Ты принят, "+name));
return name;
}
else serverHandshake(connection);
}
else serverHandshake(connection);
return name;
}*/
private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException {
while (true){
connection.send(new Message(MessageType.NAME_REQUEST, "Превед, медвед. Как звать?"));
Message answer = connection.receive();
if (answer.getType() != MessageType.USER_NAME) continue;
String userName = answer.getData();
if (userName == null || userName.isEmpty()) continue;
if (connectionMap.containsKey(userName)) continue;
connectionMap.put(userName, connection);
connection.send(new Message(MessageType.NAME_ACCEPTED, "Challenge accepted, "+userName));
return userName;
}
}
private void notifyUsers(Connection connection, String userName) throws IOException {
for (Map.Entry<String, Connection> entry : connectionMap.entrySet()) {
if (!entry.getKey().equals(userName)) {
connection.send(new Message(MessageType.USER_ADDED, entry.getKey()));
}
}
}
private void serverMainLoop(Connection connection, String userName) throws IOException, ClassNotFoundException {
while (true) {
Message message = connection.receive();
if (message.getType() == MessageType.TEXT)
sendBroadcastMessage(new Message(MessageType.TEXT, userName + ": " + message.getData()));
else ConsoleHelper.writeMessage("Error!");
}
}
}
private static Map<String, Connection> connectionMap = new ConcurrentHashMap<>();
public static void sendBroadcastMessage(Message message) {
try {
for (Connection connection : connectionMap.values()) {
connection.send(message);
}
}
catch (IOException e) {
System.out.println("Сообщение не отправлено");
}
}
public static void main (String[] args) throws IOException {
int port = ConsoleHelper.readInt();
ServerSocket serSoc = new ServerSocket(port);
System.out.println("Сервер грантед тикет");
try {
while (true) {
Handler handler = new Handler(serSoc.accept());
handler.start();
}
}
catch (Exception e) {
serSoc.close();
System.out.println(e.getMessage());
}
}
}