1
package com.javarush.task.task30.task3008;
import java.io.Console;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
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) {
ArrayList<Connection> list = new ArrayList<>(connectionMap.values());
for (Connection con : list) {
try {
con.send(message);
} catch (IOException e) {
System.out.println("Не отправлено!");
}
}
}
public static void main(String[] args) throws IOException {
Socket socket = null;
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(ConsoleHelper.readInt());
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Сервер запущен");
try {
while (true) {
socket = serverSocket.accept();
Handler handler = new Handler(socket);
handler.start();
}
} catch (IOException e) {
System.out.println(e);
serverSocket.close();
}
}
private static class Handler extends Thread {
Socket socket;
Handler(Socket socket) {
this.socket = socket;
}
private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException {
Message message;
while (true) {
connection.send(new Message(MessageType.NAME_REQUEST, "Введите имя: "));
message = connection.receive();
String name = message.getData();
if (message.getType() == MessageType.USER_NAME && !name.equals("") && !connectionMap.containsKey(name)) {
connectionMap.put(name, connection);
connection.send(new Message(MessageType.NAME_ACCEPTED, "Имя принято!"));
return name;
}
}
}
private void notifyUsers(Connection connection,String userName) throws IOException {
for (Map.Entry <String,Connection> map : connectionMap.entrySet()) {
String name = map.getKey();
Message message = new Message(MessageType.USER_ADDED,name);
if (!name.equals(userName)){
connection.send(message);
}
}
}
private void serverMainLoop(Connection connection,String userName) throws IOException, ClassNotFoundException {
while(true) {
Message firstMessage = connection.receive();
if (firstMessage.getType()==(MessageType.TEXT)) {
Message secondMessage = new Message(MessageType.TEXT,userName + ": " + firstMessage.getData());
sendBroadcastMessage(secondMessage);
}else{
ConsoleHelper.writeMessage("Ошибка!");
}
}
}
@Override
public void run() {
ConsoleHelper.writeMessage(String.valueOf(socket.getRemoteSocketAddress()));
try (Connection connection = new Connection(socket)) {
String userName=serverHandshake(connection);
sendBroadcastMessage(new Message(MessageType.USER_ADDED,userName));
notifyUsers(connection,userName);
serverMainLoop(connection,userName);
connectionMap.remove(userName);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED,userName));
} catch (IOException | ClassNotFoundException e) {
ConsoleHelper.writeMessage("Ощибка в Run!");
}
}
}
}