?
package com.javarush.task.task30.task3008;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;
public class Server {
private static Map<String, Connection> connectionMap = new ConcurrentHashMap<>();
public static void sendBroadcastMessage(Message message){
connectionMap.forEach((name, connection) -> {
try{
connection.send(message);
} catch (IOException e) {
System.err.println("Broadcast send error on " + name);
}
});
}
public static void main(String[] args) {
ServerSocket serverSocket=null;
Socket socket=null;
try{
serverSocket = new ServerSocket(ConsoleHelper.readInt());
System.out.println("Server start");
while(true){
socket = serverSocket.accept();
Handler handler = new Handler(socket);
handler.start();
}
} catch (IOException e){
System.out.println("Error port reading from console");
try{serverSocket.close();} catch (IOException er){}
}
}
private static class Handler extends Thread{
private Socket socket;
public Handler(Socket socket){
this.socket=socket;
}
private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException{
String userName=null;
Message answer=null;
while(true){
connection.send(new Message(MessageType.NAME_REQUEST));
answer = connection.receive();
if(answer.getType()!=MessageType.USER_NAME) continue;
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));
return userName;
}
}
private void notifyUsers(Connection connection, String userName) throws IOException{
for (String name: connectionMap.keySet())
{
try{
if(!userName.equals(name)) connection.send(new Message(MessageType.USER_ADDED,name));
} catch (IOException e) {
System.err.println("notifyUsers error on " + name);
}
}
}
private void serverMainLoop(Connection connection, String userName) throws IOException, ClassNotFoundException{
String name=null;
Message inputMessage = null;
while(true){
inputMessage = connection.receive();
if(inputMessage.getType()==MessageType.TEXT)
{sendBroadcastMessage(new Message(MessageType.TEXT,userName+": "+inputMessage.getData()));}
else {ConsoleHelper.writeMessage("SendBrodcast not TEXT in");}
}
}
public void run (){
String userName=null;
System.out.println("run connection with"+socket.getRemoteSocketAddress());
try{
Connection conn = new Connection (socket);
userName = serverHandshake(conn);
sendBroadcastMessage(new Message (MessageType.USER_ADDED,userName));
notifyUsers(conn,userName);
serverMainLoop(conn,userName);
connectionMap.remove(userName);
sendBroadcastMessage(new Message (MessageType.USER_REMOVED, userName));
}
catch(Exception e) {
}
}
}
}