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 main(String[] args) throws IOException {
ConsoleHelper consoleHelper = new ConsoleHelper();
ServerSocket serverSocket = new ServerSocket(consoleHelper.readInt());
System.out.println("Server is running");
try
{
while(true)
{
Socket socket = serverSocket.accept();
Handler handler = new Handler(socket);
handler.start();
}
}
catch(Exception ex)
{
System.out.println("Catch exception");
serverSocket.close();
}
}
public static void sendBroadcastMessage(Message message)
{
for(Connection con : connectionMap.values())
{
try
{
con.send(message);
}catch(IOException ex)
{
System.out.println("Error to send message");
}
}
}
private static class Handler extends Thread
{
private Socket socket;
public Handler(Socket socket)
{
this.socket = socket;
}
private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException {
while (true)
{
connection.send(new Message(MessageType.NAME_REQUEST));
Message answer = connection.receive();
if (answer.getType() == MessageType.USER_NAME)
{
if (!answer.getData().isEmpty())
{
if (!connectionMap.containsKey(answer.getData()))
{
connectionMap.put(answer.getData(), connection);
connection.send(new Message(MessageType.NAME_ACCEPTED));
return answer.getData();
}
}
}
}
}
private void sendListOfUsers(Connection connection, String userName) throws IOException {
for(Map.Entry<String, Connection> map : connectionMap.entrySet())
{
String name;
if(userName != (name = map.getKey()))
{
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)
{
StringBuilder sb = new StringBuilder();
sb.append(userName+": "+message.getData());
sendBroadcastMessage(new Message(MessageType.TEXT,sb.toString()));
} else if(message.getType() != MessageType.TEXT)
{
ConsoleHelper.writeMessage("It is not a message");
}
}
}
public void run() {
if(socket != null && socket.getRemoteSocketAddress() != null)
{
ConsoleHelper.writeMessage("Connection with remote address is established. " + socket.getRemoteSocketAddress() );
}
String userName = null;
try (Connection connection = new Connection(socket))
{
userName = serverHandshake(connection);
sendBroadcastMessage(new Message(MessageType.USER_ADDED,userName));
sendListOfUsers(connection,userName);
serverMainLoop(connection,userName);
}catch (IOException | ClassNotFoundException ex)
{
ConsoleHelper.writeMessage("Error to communicate data to remote address.");
}finally
{
if(userName != null)
{
connectionMap.remove(userName);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED,userName));
}
ConsoleHelper.writeMessage("Connection of remote address is closed.");
}
}
}
}
Олег
31 уровень
такс-такс што тут у нас
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
KRonst Backend Developer
5 августа 2018, 13:43полезный
Перепиши метод clientHandshake: вместо switch используй if-else.
+1
Олег
5 августа 2018, 14:30
та уже допер хоть и не понял чем кейс не по нраву.. Спасибо.
0
s1tcomsfan
5 августа 2018, 17:46полезный
Я не понимаю почему метод пробрасывает исключения и в нем же вы эти же исключения ловите try...catch
+1
WikkoDoc
25 марта 2019, 21:18
Здравствуйте. Не могли бы вы прислать мне код из упражнения. Я уже устал от 35 попыток...
Это мой код что не так?
+1
Aleksej Kudrawets
7 июня 2020, 10:38
у меня похожая версия и все равно ругается на последний пункт, думаю, в таких случаях проще с гитхаба скопировать, нежели тратить время и нервы в угоду валидатору, я вот убедился, все так, но он как то хочет по своему
0