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) {
e.printStackTrace( );
ConsoleHelper.writeMessage("ошибка при обмене данными с удаленным адресом");
}
} catch (IOException e) {
e.printStackTrace( );
ConsoleHelper.writeMessage("ошибка при обмене данными с удаленным адресом");
}
finally {
if (nameUser != null){
connectionMap.remove(nameUser);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED,nameUser));
}
}
ConsoleHelper.writeMessage("соединение с удаленным адресом закрыто");
}
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){
try{
for (Connection connection: connectionMap.values()){
connection.send(message);
}
}
catch (Exception e){
e.getMessage();
}
}
public static void main(String[] args) throws Exception {
int port = ConsoleHelper.readInt();//считываем номер порта
ServerSocket serverSocket = new ServerSocket(port);//Создаем объект сервер сокет
System.out.println("Server start");//выводим сообщение что сервер запущен
try{
while (true) {
Socket socket = serverSocket.accept();
Handler handler = new Handler(socket);
handler.start();
}
}
catch (Exception e){
serverSocket.close();
e.getMessage();
}
}
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) && (!answer.getData().isEmpty()) && (!connectionMap.containsKey(answer.getData()))) {
connection.send(new Message(MessageType.NAME_ACCEPTED));
connectionMap.putIfAbsent(answer.getData(), connection);
//connection.send(new Message(MessageType.USER_ADDED));
return answer.getData();
}
}
}
private void sendListOfUsers(Connection connection, String userName) throws IOException{
for (Map.Entry<String, Connection> connectionEntry : connectionMap.entrySet()){
String name = connectionEntry.getKey();
Connection connection1 = connectionEntry.getValue();
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 message = connection.receive( );
if (message.getType( ) == MessageType.TEXT) {
String string = userName + ": " + message.getData( );
Message message1 = new Message(message.getType( ), string);
sendBroadcastMessage(message1);
} else {
ConsoleHelper.writeMessage("Ошибка, отсуствует текст");
}
}
}
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) {
e.printStackTrace( );
ConsoleHelper.writeMessage("ошибка при обмене данными с удаленным адресом");
}
} catch (IOException e) {
e.printStackTrace( );
ConsoleHelper.writeMessage("ошибка при обмене данными с удаленным адресом");
}
finally {
if (nameUser != null){
connectionMap.remove(nameUser);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED,nameUser));
}
}
ConsoleHelper.writeMessage("соединение с удаленным адресом закрыто");
}
}
}