Reputation: 3
I want to check if any of my client has disconnected.From my research, a possible way is that I could keep writing messages to the clients. If the client fails to receive the message, it means it has disconnected. I send a message "Checking Connection: Client" + clientNo" to the respective clients.
I connect clientNo 1 to the server and it receive
Client1
"Checking Connection: Client1" <-- output every 10secs
"Checking Connection: Client1" <-- output every 10secs
"Checking Connection: Client1" <-- output every 10secs
but when I connect another client to the server, my clientNo1 stops receiving the message from the server and my clientNo2 will now receive
Client2
"Checking Connection: Client2" <-- output every 10secs
"Checking Connection: Client1" <-- output every 10secs
"Checking Connection: Client2" <-- output every 10secs
"Checking Connection: Client1" <-- output every 10secs
Desired output
Client1
"Checking Connection: Client1" <-- output every 10secs
"Checking Connection: Client1" <-- output every 10secs
"Checking Connection: Client1" <-- output every 10secs
Client2
"Checking Connection: Client2" <-- output every 10secs
"Checking Connection: Client2" <-- output every 10secs
"Checking Connection: Client2" <-- output every 10secs
Please help. Thank you.
Server.java
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private int portNo = 0;
private ObjectOutputStream out;
private ObjectInputStream in;
private boolean clientAlive = true;
@SuppressWarnings("resource")
public Server(int portNo) {
Socket socket = null;
this.portNo = portNo;
ServerSocket sSocket = null;
int clientNo = 1;
try {
sSocket = new ServerSocket(this.portNo);
} catch (IOException e1) {
e1.printStackTrace();
}
while(true) {
try {
socket = sSocket.accept();
} catch (IOException e) {
e.printStackTrace();
}
new Thread(new acceptClient(socket,clientNo)).start();
clientNo += 1;
}
}
class acceptClient implements Runnable {
Socket socket;
int clientNo = 1;
String writeToClient = "";
public acceptClient(Socket socket, int clientNo) {
this.socket = socket;
this.clientNo = clientNo;
}
public void run() {
try {
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
} catch(IOException exception) {
System.out.println("Error: " + exception);
}
while(clientAlive) {
writeToClient = "Checking Connection: Client" + clientNo;
sendData(out, writeToClient.getBytes());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(!clientAlive) {
break;
}
}
}
}
public synchronized void sendData(ObjectOutputStream os, byte[] byteData) {
if (byteData == null) {
return;
}
try {
os.write(byteData);
os.flush();
}
catch (Exception e) {
System.out.println("Client Disconnected");
clientAlive = false;
}
}
public static void main(String[] args) {
System.out.println("Server started");
new Server(5550);
}
}
Client.java
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
public class Client {
public static void main(String args[]) {
clientConnection();
}
public static void clientConnection() {
Socket clientSocket = null;
ObjectOutputStream out = null;
ObjectInputStream in = null;
try {
clientSocket = new Socket("localhost", 5550);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
out = new ObjectOutputStream(clientSocket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
try {
in = new ObjectInputStream(clientSocket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
byte[] byteData = null;
while(true) {
try {
byteData = receive(in);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(new String(byteData));
}
}
public static byte[] receive(ObjectInputStream is) throws Exception {
try {
byte[] inputData = new byte[1024];
is.read(inputData);
return inputData;
}
catch (Exception exception) {
throw exception;
}
}
}
Upvotes: 0
Views: 625
Reputation: 5463
Your ObjectInputStream
and ObjectOutputStream
are part of the Server
class. Make them members of acceptClient
class and it should be OK.
Upvotes: 2