I was Developing a Multi threaded Server/Client Socket in java. Whenever a client Connects to the Server, a Thread for it will be created. but when a client got disconnected or its process closed by user, its thread will still remain in Server. how can I know a socket is disconnected then I can kill the corresponding thread in server? by the way, I have a checking system in Server which checks if the client is already registered with an id or not. so for example when a client with ID=12 connects and suddenly disconnects then wants to connect again, the server will not let the client get connected because it's server keeps its socket information in an ArrayList and tells the client that a client with ID=12 is already running in the server. please help me how to fix this
Here is my Server Code:
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(9898);
System.out.println("Server Created!");
while (true) {
Socket socket = serverSocket.accept();
Thread t = new Thread(() -> ClientManager.getInstance().run(socket));
t.start();
System.out.println("Thread for Socket " + socket.getPort() + " Created");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
and this is my Client Manager Code:
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
public class ClientManager {
private ArrayList<SocketHub> socketHubs = new ArrayList<>();
private ArrayList<SocketPhone> socketPhones = new ArrayList<>();
private static ClientManager instance;
public static ClientManager getInstance() {
if (instance == null) {
instance = new ClientManager();
}
return instance;
}
public void run(Socket socket) {
String identity = null;
String id = null;
try {
boolean receiveData = false;
while (!receiveData) {
int i = socket.getInputStream().available();
while (i > 0) {
byte[] buffer = new byte[i];
socket.getInputStream().read(buffer);
identity = new String(buffer);
String[] idAndIdendity = identity.split("\\s");
identity = idAndIdendity[0];
id = idAndIdendity[1];
System.out.println("Identity & ID Received: " + identity + " " + id);
receiveData = true;
break;
}
}
if (identity.toLowerCase().equals("hub")) {
if (findSocket(id) != null) {
System.out.println("The Hub is Already Registered!");
socket.getOutputStream().write("You are already Registered!".getBytes());
}
else {
SocketHub socketHub = new SocketHub(socket, id);
socketHubs.add(socketHub);
new Thread(socketHub).start();
System.out.println("Hub Socket " + id + " Created!");
}
}
else if (identity.toLowerCase().equals("phone")) {
SocketHub socketHub = findSocket(id);
SocketPhone socketPhone = new SocketPhone(socket, socketHub);
socketHub.setSocketPhone(socketPhone);
Thread t = new Thread(socketPhone);
socketPhones.add(socketPhone);
t.start();
System.out.println("Phone Socket " + id + " Created!");
System.out.println(socketPhone.getSocketPhone() + " is Connected to "+ socketHub.getSocketHub());
}
System.out.println("=====================================");
} catch (IOException e) {
e.printStackTrace();
}
}
private SocketHub findSocket(String id) {
for (SocketHub socket : socketHubs) {
if (socket.getId().equals(id))
return socket;
}
return null;
}
}