Сервер запускается
Клиент к нему подключается
Валидатор ругается на time out( Почему?
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 (Map.Entry<String, Connection> connection: connectionMap.entrySet()) {
try {
connection.getValue().send(message);
} catch (IOException e) {
System.out.println("Неудалось отправить сообщение пользователю "+connection.getKey());;
}
}
}
private static class Handler extends Thread{
Socket socket;
public Handler(Socket socket){
this.socket=socket;
}
@Override
public void run() {
ConsoleHelper.writeMessage("Установленно соединение с клиентом: "+socket.getRemoteSocketAddress());
Connection newConnection = null;
String newUser = null;
try {
newConnection = new Connection(socket);
newUser = serverHandshake(newConnection);
//System.out.println(newUser);
sendBroadcastMessage(new Message(MessageType.USER_ADDED, newUser));
notifyUsers(newConnection,newUser);
for (Map.Entry<String, Connection> connections:connectionMap.entrySet()) {
if (connections.getKey()!=newUser) newConnection.send(new Message(MessageType.USER_ADDED, connections.getKey()));
}
serverMainLoop(newConnection,newUser);
} catch (IOException | ClassNotFoundException e) {
ConsoleHelper.writeMessage("Произошла ошибка при обмене данными с удаленным адресом");
}finally {
if (newConnection != null) {
try {
newConnection.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
if (newUser!=null){
connectionMap.remove(newUser);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED, newUser));
}
}
ConsoleHelper.writeMessage("Соединение с удаленным адресом закрыто");
}
private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException{
while (true) {
connection.send(new Message(MessageType.NAME_REQUEST, "Введите имя пользователя"));
Message registerUser = connection.receive();
if (registerUser.getType() == MessageType.USER_NAME & registerUser.getData()!="") {
if (!connectionMap.containsKey(registerUser.getData())){
connectionMap.put(registerUser.getData(), connection);
connection.send(new Message(MessageType.NAME_ACCEPTED, "Имя принято"));
return registerUser.getData();
}
}
}
}
private void notifyUsers(Connection connection, String userName) throws IOException {
for (Map.Entry<String, Connection> connections:connectionMap.entrySet()) {
if (connections.getKey()!=userName) connection.send(new Message(MessageType.USER_ADDED, connections.getKey()));
}
}
private void serverMainLoop(Connection connection, String userName) throws IOException, ClassNotFoundException{
while (true){
Message userMassage = connection.receive();
if (userMassage.getType()==MessageType.TEXT){
StringBuffer textMessage = new StringBuffer(userName);
textMessage.append(": ").append(userMassage.getData());
sendBroadcastMessage(new Message(MessageType.TEXT, textMessage.toString()));
} else ConsoleHelper.writeMessage("Неверный тип сообщения");
}
}
}
public static void main(String[] args){
try (ServerSocket serverSocket = new ServerSocket(ConsoleHelper.readInt());){
ConsoleHelper.writeMessage("Сервер запущен");
while (true){
new Handler(serverSocket.accept()).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}