I have a little doubt that it is cause by this line:
ClientGuiView view = new ClientGuiView(this);
but not sure. I'm a missing something obvious?package com.codegym.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<String, Connection>();
public static void main(String[] args){
ConsoleHelper.writeMessage("Server port:");
int serverPort = ConsoleHelper.readInt();
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(serverPort);
ConsoleHelper.writeMessage("Server is running");
while(true){
Socket sSocket = serverSocket.accept();
Handler handler = new Handler(sSocket);
handler.start();
}
} catch(IOException e){
try {
serverSocket.close();
}
catch(IOException e2){
ConsoleHelper.writeMessage("IOException occur while closing!");
e2.printStackTrace();
}
ConsoleHelper.writeMessage("IOException occur!");
e.printStackTrace();
}
}
private static class Handler extends Thread {
private Socket socket;
public Handler(Socket socket){
this.socket = socket;
}
public void run(){
Connection connection;
try {
ConsoleHelper.writeMessage("New connection was established with a remote address : " + socket.getRemoteSocketAddress());
connection = new Connection(socket);
String userName = serverHandshake(connection);
notifyUsers(connection,userName);
sendBroadcastMessage(new Message(MessageType.USER_ADDED, userName));
serverMainLoop(connection, userName);
connection.close();
sendBroadcastMessage(new Message(MessageType.USER_REMOVED, userName));
connectionMap.remove(userName);
ConsoleHelper.writeMessage("Connection with the remote address is closed");
} catch(IOException e){
ConsoleHelper.writeMessage("An error occurred while communicating with the remote address.");
}catch(ClassNotFoundException e){
ConsoleHelper.writeMessage("An error occurred while communicating with the remote address.");
}
}
private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException {
boolean isUserNameExist = false;
while(true) {
connection.send(new Message(MessageType.NAME_REQUEST));
Message response = connection.receive();
if(response.getType().equals(MessageType.USER_NAME)){
String userName = response.getData();
if( userName != null && userName != ""){
isUserNameExist = false;
for (Map.Entry<String, Connection> x : connectionMap.entrySet()) {
if(x.getKey().equals( userName)){
isUserNameExist = true;
break;
}
}
if(!isUserNameExist){
connectionMap.put(userName, connection);
connection.send(new Message(MessageType.NAME_ACCEPTED));
return userName;
}
}
}
}
}
private void notifyUsers(Connection connection, String userName) throws IOException {
for (Map.Entry<String, Connection> x : connectionMap.entrySet()) {
if(! x.getKey().equals(userName))
connection.send(new Message(MessageType.USER_ADDED,x.getKey()));
}
}
private void serverMainLoop(Connection connection, String userName) throws IOException, ClassNotFoundException{
while(true){
try {
Message received = connection.receive();
if (received.getType().equals(MessageType.TEXT)) {
String newMessage = userName + ": " + received.getData();
sendBroadcastMessage(new Message(MessageType.TEXT, newMessage));
} else {
ConsoleHelper.writeMessage("not text error");
}
} catch(Exception e){
ConsoleHelper.writeMessage(e.getMessage());
}
}
}
}
public static void sendBroadcastMessage(Message message) {
for (Map.Entry<String, Connection> x : connectionMap.entrySet()) {
try {
x.getValue().send(message);
} catch(IOException e){
e.printStackTrace();
}
}
}
}