Где я мог так глобально накосячить, что не принимается ни по одному пункту?
Может, вообще проблема на моей локальной машине?
Или я как то нечаянно другие классы поменял при рефакторинге и теперь вообще никак не запустится.
package com.javarush.task.task30.task3008;
import com.javarush.task.task30.task3008.client.Client;
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 Map<String, Connection> connectionMap = new ConcurrentHashMap<>();
public static void sendBroadcastMessage(Message message) {
try {
for (String name : connectionMap.keySet()) {
connectionMap.get(name).send(message);
}
} catch (IOException e) {
ConsoleHelper.writeMessage("Не получилось отправить сообщение");
}
}
public static void main(String[] args) {
ServerSocket serverSocket = null;
Client client = new Client();
try {
int port = ConsoleHelper.readInt();
serverSocket = new ServerSocket(port);
ConsoleHelper.writeMessage("Сервер запущен");
while (true) {
Socket socket = serverSocket.accept();
if (socket != null) {
Handler handler = new Handler(socket);
handler.start();
}
}
} catch (Exception e) {
ConsoleHelper.writeMessage("Ошибка функции main");
try {
serverSocket.close();
} catch (IOException ioe) {
ConsoleHelper.writeMessage("Ошибка закрытия серверного сокета");
}
}
}
private static class Handler extends Thread {
private Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException {
Message messageToSend = new Message(MessageType.NAME_REQUEST, "Введите имя пользователя");
Message messageToReceive = new Message(MessageType.TEXT, "");
boolean isAnyProblem = true;
boolean c1, c2, c3, c4;
String key = "";
while (isAnyProblem) {
c4 = false;
connection.send(messageToSend);
messageToReceive = connection.receive();
key = messageToReceive.getData();
for (String name : connectionMap.keySet()) {
if (name.equals(key)) c4 = true;
}
if (messageToReceive.getType() == MessageType.USER_NAME) c1 = true; else c1 = false;
if (key != null) c2 = true; else c2 = false;
if (key != "") c3 = true; else c3 = false;
if (c1 & c2 & c3 & !c4) isAnyProblem = false;
}
connectionMap.put(key, connection);
connection.send(new Message(MessageType.NAME_ACCEPTED, String.format("Пользователь %s добавлен", key)));
return key;
}
private void notifyUsers(Connection connection, String userName) {
for (String name : connectionMap.keySet()) {
Message message;
if (!name.equals(userName)) {
message = new Message(MessageType.USER_ADDED, name);
try {
connection.send(message);
} catch (IOException e) {
ConsoleHelper.writeMessage("notifyUsers exception");
}
}
}
}
private void serverMainLoop(Connection connection, String userName) throws IOException, ClassNotFoundException {
while (true) {
Message message = connection.receive();
if (message.getType() == MessageType.TEXT) {
Server.sendBroadcastMessage(new Message(MessageType.TEXT, String.format("%s: %s", userName, message.getData())));
} else ConsoleHelper.writeMessage("serverMainLoop not text");
}
}
@Override
public void run() {
String user = null;
ConsoleHelper.writeMessage(String.valueOf(socket.getRemoteSocketAddress()));
try {
Connection connection = new Connection(socket);
user = serverHandshake(connection);
sendBroadcastMessage(new Message(MessageType.USER_ADDED, user));
notifyUsers(connection, user);
serverMainLoop(connection, user);
} catch (IOException e) {
ConsoleHelper.writeMessage("Run - IOException");
} catch (ClassNotFoundException e) {
ConsoleHelper.writeMessage("Run - ClassNotFoundException");
} finally {
connectionMap.remove(user);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED, user));
ConsoleHelper.writeMessage("Соединение закрыто пользователем " + user);
}
}
}
}