Server Thread beenden

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich möchte einen kleinen messenger erstellen.

ServerStart.java
Code:
import java.awt.event.ActionListener;

/*
 * Server.java
 *
 * Created on 7. Juli 2008, 10:49
 */



/**
 *
 * @author  bmr
 */
public class ServerStart extends javax.swing.JFrame implements ActionListener {
    Server s = new Server();
    
    /** Creates new form Server */
    public ServerStart() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        mainPanel = new javax.swing.JPanel();
        serverStarten = new javax.swing.JButton();
        serverBeenden = new javax.swing.JButton();
        statusLabel = new javax.swing.JLabel();
        serverStatus = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("Bundle"); // NOI18N
        setTitle(bundle.getString("ServerStart.title")); // NOI18N
        setName("ServerFrame"); // NOI18N
        setResizable(false);

        serverStarten.setText(bundle.getString("ServerStart.serverStarten.text")); // NOI18N
        serverStarten.addActionListener(this);

        serverBeenden.setText(bundle.getString("ServerStart.serverBeenden.text")); // NOI18N
        serverBeenden.addActionListener(this);

        statusLabel.setText(bundle.getString("ServerStart.statusLabel.text")); // NOI18N

        serverStatus.setText(bundle.getString("ServerStart.serverStatus.text")); // NOI18N

        org.jdesktop.layout.GroupLayout mainPanelLayout = new org.jdesktop.layout.GroupLayout(mainPanel);
        mainPanel.setLayout(mainPanelLayout);
        mainPanelLayout.setHorizontalGroup(
            mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(mainPanelLayout.createSequentialGroup()
                .add(54, 54, 54)
                .add(statusLabel)
                .add(57, 57, 57)
                .add(mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                        .add(serverBeenden, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .add(serverStarten, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .add(serverStatus, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 220, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(18, Short.MAX_VALUE))
        );
        mainPanelLayout.setVerticalGroup(
            mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(mainPanelLayout.createSequentialGroup()
                .add(30, 30, 30)
                .add(serverStarten)
                .add(18, 18, 18)
                .add(serverBeenden)
                .add(54, 54, 54)
                .add(mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(statusLabel)
                    .add(serverStatus))
                .addContainerGap(127, Short.MAX_VALUE))
        );

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .add(mainPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(mainPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }

    // Code for dispatching events from components to event handlers.

    public void actionPerformed(java.awt.event.ActionEvent evt) {
        if (evt.getSource() == serverStarten) {
            ServerStart.this.serverStartenActionPerformed(evt);
        }
        else if (evt.getSource() == serverBeenden) {
            ServerStart.this.serverBeendenActionPerformed(evt);
        }
    }// </editor-fold>

private void serverStartenActionPerformed(java.awt.event.ActionEvent evt) {

    if((!s.isStarted)) {
        s.start();
        s.setOnline();
        serverStatus.setText("Server gestartet");
    } else {
        serverStatus.setText("Server ist bereits gestartet");
    }
    mainPanel.validate();
    mainPanel.repaint();
        
}

private void serverBeendenActionPerformed(java.awt.event.ActionEvent evt) {
    s.interrupt();
    serverStatus.setText("Server beendet");
}

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ServerStart().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JPanel mainPanel;
    private javax.swing.JButton serverBeenden;
    private javax.swing.JButton serverStarten;
    private javax.swing.JLabel serverStatus;
    private javax.swing.JLabel statusLabel;
    // End of variables declaration

}
Code:
import java.net.*;
import java.io.*;

public class Server extends Thread {

    Boolean isStarted = false;
    

    @Override
    public synchronized void run(){
        while (isStarted) {
            try {
            ServerSocket server = new ServerSocket(4000);
            Socket client = server.accept();
            DataInputStream in = new DataInputStream(client.getInputStream());
            DataOutputStream out = new DataOutputStream(client.getOutputStream());

            String name = in.readUTF();
            String passwort = in.readUTF();
            System.out.println(name + passwort);
            out.writeUTF("ok");
            out.flush();
            in.close();
            out.close();
            } catch (Exception e) {
                System.out.println("Fehler im Server");
            }
        }
    }
    
    public void setOffline() {
        isStarted = false;
    }
    
    public void setOnline() {
        isStarted = true;
    }
}

wie kann ich denn einen neu angelgten thread beenden? sollte ich noch mehr ändern? ist mein ansatz falsch?
 
S

SlaterB

Gast
eine Exception könnte auf ein Ende der Verbindung durch den Client hindeuten,
dass solltest du prüfen und dann die Schleife mit break; verlassen
oder die Schleifenbedingung anpassen

edit: ich habe Server etwas falsch verstanden, der macht ja nochmehr,
wer soll den denn aus welchem Anlass beenden?
du könntest von außen eine boolean-Variable auf true setzen,
die pro Schleifendurchlauf geprüft wird,

solange der Thread aber auf dem Socket hört kann man ihn nicht sauber beenden,
mit einem Timeout dauert das hoffentlich nicht ewig
 
G

Gast

Gast
Naja das ist ja eigentlich auch mein ansatz. Die Methode setOffline bzw Online setzt die boolean variable auf flase bzw true. gut ich hab das hier nicht in der Serverstart Klasse implementiert , hatte das aber zuvor ausprobiert. Damit konnte der Client leider keine Meldung erhalten, dass der Server down ist. Ist mein Ansatz dnen richtig?
 
S

SlaterB

Gast
stand da
> while (isStarted)
von Anfang an und nich while (true)?
man oh meter, da habe ich ja wenig genau geschaut

> Ist mein Ansatz dnen richtig?

richtg oder falsch gibts da nicht, das ist eine Möglichkeit, relativ primitiv,
aber je nach Anforderungen völlig ausreichend

> Damit konnte der Client leider keine Meldung erhalten, dass der Server down ist.

was ja auch der Idee, den Server auszuschalten, widerspricht,
wenn der Client noch mit dem Server kommunizieren soll, dann darf er logischerweise nicht ausgeschaltet sein,

stattdessn kannst du eine boolean-Variable baldAusgeschaltet/ nurNochAufAbweiseModus auf true setzen,
einen Timer verwenden, den Client direkt selber ansprechen oder sonst was

du musst schon beschreiben, was genau in allen Situationen passieren soll
 
G

Gast

Gast
wenn der button serverBeenden gedrückt wird sprich seine action perfomed methode aufgerufen wird, so soll der server nicht mehr erreichbar sein. also der client sollte dann dieseselbe fehlermledung erhalten, als wenn der server nie gestartet wurde.

"connection refused"
 
S

SlaterB

Gast
und passiert das nicht beim Ende des Threads durch
> while (isStarted) {
?
welches Verhalten beobachtest du denn stattdessen?
was ist die Frage/ das Problem?

(wieso muss ich das nachfragen? ;) )
 
G

Gast

Gast
:)
also:

ich starte den Server in der Gui.
->Der Client bekommt eine antwort.

ich klicke auf server beenden.
->der client bekommt zunächst noch eine Antowrt
-> ein erneutes ausführen des client codes gibt keine antwort mehr.
-> ich kann eclipse nur noch übe rdie stopteste sagen, dass der client beendet werden soll
 
G

Guest

Gast
Code:
import java.net.*;
import java.io.*;


public class Client {

	Client() throws IOException {
		Socket server = new Socket("localhost", 4000);
		DataOutputStream out = new DataOutputStream(server.getOutputStream());
		DataInputStream in = new DataInputStream(server.getInputStream());
		out.writeUTF("login1");
		out.writeUTF("passwort");
		out.flush();
		System.out.println(in.readUTF());
		//System.out.println(input.read());
		server.close();
		out.close();
		
		
	}
	
	public static void main(String[] args) {
		try {
			Client client = new Client();
		} catch (IOException e) {
			System.err.println("Fehler: " + e);
		}
	}
}
 
G

Gast

Gast
hmm ok ich muss server.close() aufrufen und client.close()

public synchronized void run(){
...

while(isStarted) {
..
}

try {
server.close();
client.close();
} catch (IOException ex) {
System.out.println("put");
}

allerdings hängt sich meine gui auf, wenn ich nach dem starten auf beende drücke und dann wieder starten will :(
 
S

SlaterB

Gast
nur noch eine Antwort für den Client ist ja ganz ok,
die boolean-Variable wirkt sich ja erst auf den nächsten Schleifendurchlauf aus,

vielleicht kannst du direkt nach dem accept auch schon die Variable prüfen und dann irgendwas machen,
der Client hat dann wahrscheinlisch schon erfolgreiche eine Verbindung aufgebaut,
aber in diese wird dann zumindest nicht ok reingeschrieben sondern sofort Ende oder irgendeine 'ach, sollte gar nicht aufgebaut werden'-Nachricht rein

das Socket.accept() kann man wie gesagt nicht beenden, zumindest weiß ich es nicht,
mit TimeOut kann man die vakante Zeit zwischen setOffline() und der nächsten Client-Verbindung minimieren

--------

zur GUI kann man eh noch nichts sagen, falls das eine Frage war,
da braucht man Infos und Code,

falls die oben gepostete Server-GUI gemeint war, kann ich persönlich leider nicht weiterhelfen da ich kein
> org.jdesktop.layout.GroupLayout
kenne

einen einmal beendeten Thread kann man übrigens nicht wieder starten
 
G

Gast

Gast
org.jdesktop sollte ab jdk 6 dabei sein.
Ich benutze für die gui netbeans.
 

FArt

Top Contributor
Nur als Tipp:
deine Streams werden im Fehlerfall nicht geschlossen, isStarted sollte der primitive Datentyp boolean sein, dafür muss aber der Zugriff auf das Flag z.B. über die Deklaration volatile synchronisiert sein.
 
G

Gast

Gast
isStarted ist doch aber boolean ....
was genau ist dieses volatile
 
G

Gast

Gast
Ich bin jetzt einen schritt weiter. Und schon habe ich eine neue Frage:

wie kann ich meinen server anweisen die nachricht eines clients an alle registrierten clients zu schicken. und wie registreire ich diese clients.
 
S

SlaterB

Gast
registrieren: die Objekte, die die einzelnen Verbindungen verwalten, in eine Liste einfügen, irgendwo intelligent zentral gespeichert,
(eine statische Variable ist NICHT schön ;) )

anweisen:
naja, einfach die Liste durchlaufen und an jeden schicken
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
C Server mit Multithreading (Thread-Pool) Netzwerkprogrammierung 2
J RMI - (RemoteException occurred in server thread) Netzwerkprogrammierung 2
R Websockets oder server sent events? Netzwerkprogrammierung 2
W Windows 2019-Server Dienste starten unter Nutzer Netzwerkprogrammierung 1
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J Socket Tutorial zu Multiplayer Server schreiben? Netzwerkprogrammierung 5
S Java Chat Server Netzwerkprogrammierung 8
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
KaffeeFan Programmierung mit Cloud-Server Netzwerkprogrammierung 0
L Socket Problem mit Server Netzwerkprogrammierung 1
cezary Socket Paralleler Server ? Netzwerkprogrammierung 1
I Socket Leicht zu DDosender Server Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
J Prüfen, ob remote UDT Server erreichbar ist Netzwerkprogrammierung 0
P Server als Client nutzen Netzwerkprogrammierung 8
S Server Kommunikation Netzwerkprogrammierung 1
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
S Webservice - Server Netzwerkprogrammierung 0
M Java Eingabe auf FTP Server übergeben Netzwerkprogrammierung 4
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
M Socket Java Server: NullPointerException Netzwerkprogrammierung 4
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1
K C# Server - Android Client Netzwerkprogrammierung 0
J Framework mehrere Clients/ Server-Broadcast/oracle XE/ XML Netzwerkprogrammierung 1
D Mit Server Daten austauschen Netzwerkprogrammierung 4
V Server / mehrere Clients / MySQL / Konzept Netzwerkprogrammierung 2
P HTTP Bild von einem Server per http kopieren Netzwerkprogrammierung 1
F Verbindung zwischen Server und handy Netzwerkprogrammierung 1

Ähnliche Java Themen


Oben