Есть подозрение на участок кода, т.е. каждый раз, когда нужно вызвать метод класса SocketThread, по сути каждый раз создается новый объект.
protected SocketThread getSocketThread() {
return new SocketThread();
}
Что не так? Где порылась эта, с большими зубами?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) {
int port = ConsoleHelper.readInt();
try (ServerSocket socket = new ServerSocket(port)){
System.out.println("Сервер запущен.");
while (true) {
new Handler(socket.accept()).start();
System.out.println("Новый клиент...");
}
} catch (IOException e){
e.printStackTrace();
}
}
public static void sendBroadcastMessage(Message message){
for (Connection connection: connectionMap.values()) {
try {
connection.send(message);
} catch (IOException e) {
System.out.println("Сообщение, к сожадению, не отправлено :(");
}
}
}
private static class Handler extends Thread {
private Socket socket;
private Handler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
ConsoleHelper.writeMessage("Установлено новое соединение с адресом: " + socket.getRemoteSocketAddress());
String name = null;
try (Connection connection = new Connection(socket)) {
name = serverHandshake(connection);
Server.sendBroadcastMessage(new Message(MessageType.USER_ADDED, name));
sendListOfUsers(connection, name);
serverMainLoop(connection, name);
} catch (Exception e){
ConsoleHelper.writeMessage("Произошла ошибка обмена данными с удаленным компьютером.");
}
if (name != null){
connectionMap.remove(name);
Server.sendBroadcastMessage(new Message(MessageType.USER_REMOVED, name));
}
ConsoleHelper.writeMessage("Соединение с удаленным адресом закрыто.");
}
private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException{
String name = null;
while (true){
connection.send(new Message(MessageType.NAME_REQUEST));
Message message = connection.receive();
name = message.getData();
if (message.getType() == MessageType.USER_NAME && !message.getData().isEmpty() && !name.equals("") && !connectionMap.containsKey(name)){
connectionMap.put(name, connection);
break;
}
}
connection.send(new Message(MessageType.NAME_ACCEPTED));
return name;
}
private void sendListOfUsers(Connection connection, String userName) throws IOException{
for (String name : connectionMap.keySet()) {
if (!name.equals(userName))
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) {
ConsoleHelper.writeMessage("Information is no TEXT!");
continue;
}
Server.sendBroadcastMessage(new Message(MessageType.TEXT, userName + ": " + message.getData()));
}
}
}
}