я видимо очень тупой, или просто после работы зависаю слишком много, но плз подскажите
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 Map<String,Connection> connectionMap = new ConcurrentHashMap<>();
public static void sendBroadcastMessage(Message message){
for(Connection con : connectionMap.values()){
try{
con.send(message);
}catch(IOException e){
System.out.println("Не срослось... сообщение не отправлено :(");
}
}
}
public static void main(String[] args) throws IOException{
int port = ConsoleHelper.readInt();
ServerSocket server = null;
try{
server = new ServerSocket(port);
System.out.println("Сервер запущен...");
while(true){
Socket tmpSocket = server.accept();
System.out.println("Жду");
Handler handler = new Handler(tmpSocket);
handler.start();
}
}catch(Exception e){
System.out.println(e.getMessage());
}finally{
server.close();
}
}
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 recieve;
while(true){
connection.send(new Message(MessageType.NAME_REQUEST));
recieve = connection.receive();
if(isValidName(recieve)) break;
}
String tmpName = recieve.getData();
connectionMap.put(tmpName,connection);
connection.send(new Message(MessageType.NAME_ACCEPTED));
return tmpName;
}
private boolean isValidName (Message receive){
if (receive.getType()==MessageType.USER_NAME&&
!receive.getData().isEmpty()&&
!connectionMap.containsKey(receive.getData()))return true;
return false;
}
private void sendListOfUsers(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 mess = connection.receive();
if (mess.getType()==MessageType.TEXT) {
sendBroadcastMessage(new Message(MessageType.TEXT, mess.namedData(userName)));
} else{
try{
throw new MessageTypeException();
}catch(MessageTypeException e){
ConsoleHelper.writeMessage(e.getMessage());
}
}
}
}
@Override
public void run(){
ConsoleHelper.writeMessage(socket.getRemoteSocketAddress().toString());
String nameUser = null;
try {
Connection connection = new Connection(socket);
try {
nameUser = serverHandshake(connection);
sendBroadcastMessage(new Message(MessageType.USER_ADDED, nameUser));
sendListOfUsers(connection, nameUser);
serverMainLoop(connection, nameUser);
} catch (ClassNotFoundException e) {
ConsoleHelper.writeMessage("ошибка при обмене данными с удаленным адресом");
}
} catch (Exception e) {
e.printStackTrace( );
ConsoleHelper.writeMessage("ошибка при обмене данными с удаленным адресом");
}
finally {
if (nameUser != null){
connectionMap.remove(nameUser);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED,nameUser));
}
}
ConsoleHelper.writeMessage("соединение с удаленным адресом закрыто");
}
private class MessageTypeException extends Exception{
public MessageTypeException(){
super("Incorrect message type");
}
}
}
}