Hur sätter man server & klient som "closed" vid konstruktören - Java

Permalänk

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 } } }

Permalänk
Medlem

När konstruktorn körs så finns det ju varken en server eller klient skapad ännu, så de kan aldrig vara anslutna i det läget.

Vanligtvis brukar man ha en server som står och rullar, och allt som behöver prata med varandra går via den (iaf vad jag stött på).

Visa signatur

Intel Core i7 6700K | Gigabyte Z170X-UD3 | Corsair Vengeance LPX 16GB DDR4 2400Mhz | EVGA GTX 980Ti Hybrid | Samsung 950 PRO 256GB | Noctua NH-D15 | EVGA G2 750 | Fractal Design Define R5

Permalänk
Skrivet av Zajin:

När konstruktorn körs så finns det ju varken en server eller klient skapad ännu, så de kan aldrig vara anslutna i det läget.

Vanligtvis brukar man ha en server som står och rullar, och allt som behöver prata med varandra går via den (iaf vad jag stött på).

Jag testade med denna metod som anrop vid konstruktören. Jag har inte fått igång kommunikationen än då jag håller på med Pi4J och PrimeFaces.

/* * Init socket for client and server */ private void initSocket(){ try { server = new ServerSocket(); server.close(); client = new Socket(); client.close(); } catch (IOException e) { status = "Cannot init sockets"; } }

Permalänk
Medlem

Har inte använt sockets I Java själv men skulle nog separerat server och klient till egna klasser.

För att slippa initiera och stänga socket så kan du lämna dem oinitierade och kolla om de är null eller closed. Om något är sant initiera en ny och kör accept.

Lite bra socket exempel:
http://cs.lmu.edu/~ray/notes/javanetexamples/

Skickades från m.sweclockers.com

Visa signatur

Intel Core i7 6700K | Gigabyte Z170X-UD3 | Corsair Vengeance LPX 16GB DDR4 2400Mhz | EVGA GTX 980Ti Hybrid | Samsung 950 PRO 256GB | Noctua NH-D15 | EVGA G2 750 | Fractal Design Define R5