2016-04-23 10 views
-1

Ich dachte, das Schließen des Servers Socket würde den Server trennen. Fehle ich etwas? Irgendwelche Ideen?Server vom Socket im Chat-Programm trennen

+1

Bitte vandalisiere deine Posts nicht. Klicken Sie bitte auf Löschen, um den Beitrag zu löschen, wenn Sie ihn löschen möchten. –

+0

@PraveenKumar Ich kann den Beitrag leider nicht löschen. Bitte kennzeichnen Sie es für Spam. Danke – Guest1235

+0

Bitte hebe ein Mod-Flag an und erkläre, warum du es löschen willst. –

Antwort

0

versuchen, den Server-Buchse alle Ihre Steckdose schließen ...

public class MyServer { 
    public static final int PORT = 12345; 
    public static void main(String[] args) throws IOException, InterruptedException { 
     ServerSocket ss = ServerSocketFactory.getDefault().createServerSocket(PORT); 
     Socket s = ss.accept(); 
     Thread.sleep(5000); 
     ss.close(); 
     s.close(); 
    } 
} 

public class MyClient { 
    public static void main(String[] args) throws IOException, InterruptedException { 
     Socket s = SocketFactory.getDefault().createSocket("localhost", MyServer.PORT); 
     System.out.println(" connected: " + s.isConnected()); 
     Thread.sleep(10000); 
     System.out.println(" connected: " + s.isConnected()); 
    } 
} 

Siehe Inhalt here...

+1

Mein Server läuft in einem separaten Thread, der 'ServerThread' Klasse, um ein Einfrieren der GUI zu vermeiden. Ich nehme an, ich rufe ServerThread.sleep() in der Serverklasse auf. Außerdem hat meine Server-Klasse kein Socket-Objekt (das auf der Client-Seite, um Verbindungen zu akzeptieren) – Guest1235

0

Mein Server auf einem separaten Thread ausgeführt wird, Serverthread-Klasse, die gui ein Einfrieren zu vermeiden. Ich nehme an, ich rufe ServerThread.sleep() in der Serverklasse auf. Auch meine Serverklasse keine Socket-Objekt haben (seine auf der Clientseite akzeptieren Verbindungen)

Soweit ich Sie verstehen, Sie haben die Serversocket-Objekt in der Client-Klasse deklariert und rufen Sie die Serversocket: accept() Methode von dort. Diese Methode soll Unterbrechungen wie dem Schließen des zugrundeliegenden ServerSockets oder dem Aufrufen von Interrupt() auf dem Thread, das den Socket enthält, "überleben".

Die einzige Möglichkeit, den ServerSocket zu beenden: Die Methode accept() ist eine SocketTimeOutException, wie in here erwähnt.

So, hier ist ein Beispiel:

ServerSocket server = new ServerSocket(PORT); 
server.setSoTimeOut(MILLISECONDS_TO_TIMEOUT); 

while(YOUR_SERVER_SHOULD_RUN){ 

    try{ 
     Socket s = server.accept(); 
     //Do stuff with the new socket 
    }catch(SocketTimeOutException ignored){} 
} 

Das Timeout des ServerSocket- verursacht eine Ausnahme zu werfen, wenn es vorbei ist. Sie können diese Ausnahme abfangen und ignorieren. Ziel ist es, den Zustand der While-Schleife zu überprüfen.

+1

Ich habe meine 'Socket'- und' ServerSocket'-Objekte in der 'Server'-Klasse deklariert. Ich akzeptiere den 'Socket' in der' Server' Klasse, und der 'Socket' befindet sich innerhalb einer' while-Schleife', die unendlich läuft um alle Verbindungen zu akzeptieren. Auf der 'Client'-Seite habe ich ein' Socket'-Objekt, das einer Klasse mit dem Namen 'ClientConnection' zugewiesen ist (erweitert runnable, handhabt jede Instanz jedes Clients) – Guest1235

+1

Ich möchte nicht, dass mein Server einfach Timeout, ich wollte es nicht auf Knopfdruck schließen. Bitte lesen Sie die Frage noch einmal, wenn Sie mehr Code benötigen, kann ich sie posten. – Guest1235

+0

U hat mich nicht richtig verstanden ... was ich dir gesagt habe, wird nur benutzt um aus der accept() - Methode des Server Sockets auszubrechen; und ** NOT ** um den Server auszusetzen! Lesen Sie zuerst die Frage und dann beschweren Sie sich .... Wenn Sie nicht aus dieser Methode herauskommen, haben Sie keine Chance, die Schleife zu beenden, wo Sie die eingehenden Verbindungen akzeptieren ... ** DAS TIMEOUT IST NUR UND NUR FÜR Beenden der ACCEPT() -Methode, PRÜFEN, WENN DER SERVER AUSGELEGT WIRD ** und dann accept() aufrufen ... Ihre Schaltfläche kann die Bedingung für die while-Schleife umschalten und der Server wird nur heruntergefahren, wenn Sie Ihre alberne drücken Taste! – tedy42

Verwandte Themen