Hur sätter man server & klient som "closed" vid konstruktören - Java
Hej!
Jag ska ha lite kommunikation mellan en server och en klient. Då använder jag Java och sockets. Det jag börjar med är att starta upp servern med Java. Men innan jag gör detta så kollar jag först om servern är stängd eller inte. Om den är stängd -> starta upp. Om den redan är uppstartad -> gör inget.
Orsaken varför jag har valt att göra så har med att jag servern ska ju skicka till klienten hela tiden, men klienten ska inte skicka något tillbaka. Så jag tar för givet att det kommer bli en "missanslutning" mellan servern och klienten där kanske servern tappar sin anslutning och måste återuppta sin anslutning igenom att starta om servern, vilket i sin tur leder till att klienten får göra exakt samma sak.
Men då har jag frågan: Innan jag startar upp servern, eller ansluter klienten till servern, så kollar jag först om servern är stängd eller om klienten är ansluten. Detta kräver att jag först måste initiera ett objekt. Annars får jag null pointer exception.
Så vad är bästa lösningen att sätta server som "closed" och klienten som "not connected" i konstruktören? Eller är det här "finally" och "bound" kommer till hjälp?
Så här ser min kod ut.
public class SocketClient extends Thread {
/*
* Operation panel
*/
private String host; // "server" or "client"
private String url_server_fan;
private int port_server_fan;
private String status;
private int period;
private int count;
private boolean startButton;
/*
* Socket objects
*/
private Socket client;
private ServerSocket server;
private Socket serverAccept;
private DataInputStream input;
private DataOutputStream output;
/*
* H-bridge object
*/
private Sn754410ne sn754410ne;
public SocketClient(Sn754410ne sn754410ne) {
this.sn754410ne = sn754410ne;
// Reset
count = 0;
}
@Override
public void run() {
while (true) {
// Control the fans
operate();
// Sleep 1 second
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// Write error
}
}
}
/*
* This method will be called every second from the thread
*/
public void operate() {
// Check if host is server or client
if (host.equals("server")) {
// Check if the activity of the server
startServer();
// Turn the fan
if (period / 2 >= count) {
sn754410ne.enableClockWise();
sendToClient("counterclockwise");
} else {
sn754410ne.enableCounterClockWise();
sendToClient("clockwise");
}
// Count
if (period >= count)
count++;
else
count = 0; // Reset
} else { // Client
try {
// Check the connection with the server
connetClient();
if (input.available() > 0) {
// Yes!
String command = input.readUTF(); // command = "clockwise" or "counterclockwise"
// Turn the fan
if (command.equals("clockwise")) {
sn754410ne.enableClockWise();
} else { // "counterclockwise"
sn754410ne.enableCounterClockWise();
}
}
} catch (Exception e) {
// Write error here
}
}
}
/*
* Try to connect to server from client
*/
public void connetClient() {
// Check if the client is not connected
if(client.isConnected() == false) {
// Yes! Connect it
try {
client.close(); // Fist close so we reset
client = new Socket(url_server_fan, port_server_fan); // Connect to server
input = new DataInputStream(client.getInputStream()); // Open connection to the server from client
} catch (Exception e) {
// Write and error here!
}
}
}
/*
* Start up the server
*/
public void startServer() {
// Check if the server is closed
if (server.isClosed() == true) {
// Yes! Start it!
try {
server = new ServerSocket(port_server_fan);
serverAccept = server.accept(); // Wait for the client to connect
output = new DataOutputStream(serverAccept.getOutputStream()); // Open output for sending -> client
} catch (Exception e) {
// Write an error here!
}
}
}
/*
* Send a message to the client from server
*/
public void sendToClient(String message) {
try {
output.writeUTF(message);
output.flush();
} catch (Exception e) {
// Write error here
}
}
}