my code is timing out,i don't know why
package com.codegym.task.task30.task3008;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Handler;
public class Server {
private static Map<String,Connection> connectionMap;
static {
connectionMap = new ConcurrentHashMap<> ( );
}
public static void main(String[] args) throws IOException {
connectionMap = new ConcurrentHashMap<String, Connection> ( );
int port = ConsoleHelper.readInt ();
java.net.ServerSocket serverSocket = new ServerSocket ( port );
System.out.println ( "Server is running" );
while(true){
Socket socket = null;
try {
socket = serverSocket.accept ();
Thread handler = new Handler ( socket );
handler.start ();
}catch (Exception o) {
//socket.close ();
serverSocket.close ();
System.out.println ( "Error" );
break;
}
}
}
private static class Handler extends Thread {
private Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
// ConsoleHelper.writeMessage ( "Connection has been established whit remote address " + socket.getRemoteSocketAddress () );
// try {
// Connection connection = new Connection ( socket );
// String userName = serverHandshake ( connection );
// sendBroadcastMessage ( new Message ( MessageType.USER_ADDED,userName ) );
// notifyUsers ( connection,userName );
// serverMainLoop ( connection,userName );
// connectionMap.remove ( userName );
// sendBroadcastMessage ( new Message ( MessageType.USER_REMOVED,userName + " has been removed" ) );
//
// }catch (Exception o){
//
// }finally {
// try {
// socket.close ();
// }catch (Exception o ){
//
// }
// }
String userName = null;
Connection connection = null;
do {
try {
ConsoleHelper.writeMessage("New connection was established with a remote address " + socket.getRemoteSocketAddress());
connection = new Connection(socket);
} catch (Exception ig) {
break;
}
try {
userName = serverHandshake(connection);
} catch (Exception ig) {
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
try {
sendBroadcastMessage(new Message(MessageType.USER_ADDED, userName));
notifyUsers(connection, userName);
serverMainLoop(connection, userName);
} catch (Exception e) {
} finally {
connectionMap.remove(userName);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED, userName));
try {
connection.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
} while (false);
ConsoleHelper.writeMessage("Connection closed: " + socket.getRemoteSocketAddress());
}
private String serverHandshake(Connection connection) throws IOException,ClassNotFoundException{
while(true){
connection.send ( new Message ( MessageType.NAME_REQUEST ) );
Message answer = connection.receive ();
if(answer.getType ().equals (MessageType.USER_NAME)){
String data = answer.getData ();
if(data != null & (!data.isEmpty ()) & (!connectionMap.containsKey ( data ))){
connectionMap.put (data,connection );
connection.send ( new Message ( MessageType.NAME_ACCEPTED ) );
return data;
}else {
continue;
}
}else {
continue;
}
}
}
private void notifyUsers(Connection connection,String userName) throws IOException{
for(ConcurrentHashMap.Entry<String,Connection> map : connectionMap.entrySet ()){
//String name = map.getKey ();
// Message message = new Message ( MessageType.USER_ADDED,name );
if(!map.getKey ().equals ( userName )) {
connection.send ( new Message ( MessageType.USER_ADDED,map.getKey () ) );
}
}
}
private void serverMainLoop(Connection connection,String userName)
throws IOException,ClassNotFoundException{
while(true) {
try {
Message message = connection.receive ();
if (message.getType ().equals ( MessageType.TEXT )) {
Message newMessage = new Message ( MessageType.TEXT, userName + ": " + message.getData () );
sendBroadcastMessage ( newMessage );
} else
ConsoleHelper.writeMessage ( "Error" );
}catch (Exception o){
}
}
}
}
public static void sendBroadcastMessage(Message message){
for(Connection c : connectionMap.values()){
try {
c.send(message);
} catch (IOException e) {
ConsoleHelper.writeMessage("Message couldn't be sent.");
}
}
}
}