Не могу понять в чем проблема. У товарища похожее решение https://javarush.com/help/5105
но у него методы съехали из класса. у меня вроде на месте... на нулы проверил...
package com.javarush.task.task30.task3008;
import java.util.Map;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;
import java.util.concurrent.ConcurrentHashMap;
import static com.javarush.task.task30.task3008.ConsoleHelper.readInt;
public class Server {
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("Не смогли отправить сообщение.");}
}
private static class Handler extends Thread {
private Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
System.out.println("Установлено новое соединение" + socket.getRemoteSocketAddress());
try {
Connection connection = new Connection(socket);
String userName = serverHandshake(connection);
notifyUsers(connection, userName);
sendBroadcastMessage(new Message(MessageType.USER_ADDED, userName));
serverMainLoop(connection, userName);
connectionMap.remove(userName);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED, userName));
} catch ( IOException e ) {
ConsoleHelper.writeMessage("произошла ошибка при обмене данными с удаленным адресом");
} catch ( ClassNotFoundException e ) {
ConsoleHelper.writeMessage("произошла ошибка при обмене данными с удаленным адресом");
}
}
private String serverHandshake(Connection connection)throws IOException, ClassNotFoundException{
String userName;
Message request = new Message(MessageType.NAME_REQUEST);
Message answer;
do {
connection.send(request);
answer = connection.receive();
userName = answer.getData();
}while((answer.getType() != MessageType.USER_NAME)||userName.isEmpty()||connectionMap.containsKey(userName));
connectionMap.put(userName, connection);
connection.send(new Message(MessageType.NAME_ACCEPTED, "Ваше имя принято!"));
return userName;
}
private void notifyUsers(Connection connection, String userName) throws IOException{
for(String name : connectionMap.keySet()){
if(!name.equals(userName)){
connection.send(new Message(MessageType.USER_ADDED, name));
}
}
}
private void serverMainLoop(Connection connection, String userName) throws IOException, ClassNotFoundException{
while(true){
Message message =connection.receive ();
if(message.getType() == MessageType.TEXT){
String text = message.getData();
Server.sendBroadcastMessage(new Message(MessageType.TEXT, userName + ": " + text));
}else {
ConsoleHelper.writeMessage("Exception!");
}
}
}
}
public static void main(String[] args)throws Exception {
Handler handler;
ServerSocket serverSocket = null;
Socket socket;
int port = readInt();
try {
serverSocket = new ServerSocket(port); //
System.out.println("Сервер запущен!");
while(true) {
socket = serverSocket.accept();
handler = new Handler(socket);
handler.start();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
serverSocket.close();
}
}
}