ServerSocket.accept() unterbrechen

HazlNut

Mitglied
Moinsen!

Hab gerade mal ne halbe stunde verbracht um das Forum zu durchsuchen, aber leider nichts was mich betrifft gefunden...Na dann mal nen neuen Thread öffnen:D

Also mein Problem ist folgendes:

Soll einen ganz normalen Multichat erstellen der Nachrichten von Clients an alle verteilt. Aufgabe ist auch, dass sobald man in der GUI des Servers auf Stop drückt, alles fein säuberlich geschlossen wird.
In meiner GUI fängt das dann so an:

Java:
	public void actionPerformed(ActionEvent e) {
		String command = e.getActionCommand();

		if (command.equals("start")) {
			start = new Thread(new ServerChatStarter());
			start.start();
		} else if (command.equals("stop")) {
			sc.stop();
			System.out.println("acceptClient = false");
		} else if (command.equals("send")) {
			
		}
	}
Im Serverchat steht dann folgendes:

Java:
	public void stop(){
		acceptClient = false;
	}
	
	public void start(){
		try {
			chatTeilnehmer = new TeilnehmerListe();
			messages.setText("Server wird gestarted.\nPort wird geoeffnet\n");
			serverSocket = new ServerSocket(port);
			while(acceptClient){
				connect = new Thread(new ConnectionHandler(serverSocket.accept(), messages));
				messages.append("Client accepted\n");
				connect.start();
				messages.append("Connectionhandler gestartet.\n");
			}
			System.out.println("Interrupt wird gesetzt.");
			connect.interrupt();
		} catch (IOException e) {
			messages.append("Port konnte nicht geoeffnet werden\n");
		}
	}

Problem ist dabei, accept() ist ja blockierend und es passiert einfach nichts ;(
Habe es schon mit einem setSoTimeOut versucht (evtl aber falsch da es nicht geklappt hat :applaus: )
Hoffe es gibt diese Frage nicht schonmal und bedanke mich schonmal für Antworten.

LG
 

Sen-Mithrarin

Gesperrter Benutzer
ähm ... da sind aber mal gleich mehrere fehler drin versteckt

1) du hast einen Thread / Runnable und diese enthält start() und stop() ! vorsicht : ungewolltest override !
nutze lieber eindeutige namen startServer() und stopServer() !

2) beim starten hast du : start = new Thread(new ServerChatStarter()); start.start(); ... greifst dann beim stoppen aber auf "sc" zu ...
zwei referenzen auf EIN objekt ? oder mehrere objekte ?

3) ServerSocket.accept() direkt im konstruktor call ? ouchn ... da hast du dann gleich mehrere halb-offene sachen
packe das accept() in eine extra zeile für einen sauberen aufruf



4) ServerSocket.accept() kann man nicht "sauber" beenden
entweder muss man auf eine verbindung warten, oder den ServerSocket gewaltsam schließen was in eine Exception läuft
 

turtle

Top Contributor
4) ServerSocket.accept() kann man nicht "sauber" beenden

APi-Doc: [JAPI]ServerSocket[/JAPI]

Da steht doch eindeutig zu accept
HTML:
SocketTimeoutException - if a timeout was previously set with setSoTimeout and the timeout has been reached.

Also ist das Reagieren auf eine SocketTimeoutException eine saubere Angelegenheit..
 

HazlNut

Mitglied
Jaa ich bin echt nich der beste würde ich ma sagen :oops:
Tu aber mein möglichst bestes :D

1) du hast einen Thread / Runnable und diese enthält start() und stop() ! vorsicht : ungewolltest override !
nutze lieber eindeutige namen startServer() und stopServer() !

Das hab ich inzwischen beseitigt :)

2) beim starten hast du : start = new Thread(new ServerChatStarter()); start.start(); ... greifst dann beim stoppen aber auf "sc" zu ...
zwei referenzen auf EIN objekt ? oder mehrere objekte ?

Also dieser ServerChatStarter macht eigentlich nur folgendes:
Java:
public class ServerChatStarter implements Runnable{

		@Override
		public void run() {
			sc = new ServerChat(Integer.parseInt(serverPort.getText()), messages);
			sc.startServer();			
		}		
	}

Meine GUI is komischerweise eingefroren, wenn ich direkt beim startbutton new ServerChat gesagt hab.
Also im Endeffekt geht es darum beim drücken von stop auf sc zuzugreifen.

3) ServerSocket.accept() direkt im konstruktor call ? ouchn ... da hast du dann gleich mehrere halb-offene sachen
packe das accept() in eine extra zeile für einen sauberen aufruf

Hab ich auch beseitigt und sieht jetz so aus:
Java:
while(acceptClient){
				Socket socket = serverSocket.accept();
				connect = new ConnectionHandler(socket, messages);
				messages.append("Client accepted\n");
				connect.start();
				messages.append("Connectionhandler gestartet.\n");
			}

4) ServerSocket.accept() kann man nicht "sauber" beenden
entweder muss man auf eine verbindung warten, oder den ServerSocket gewaltsam schließen was in eine Exception läuft

Hab das ganze jetzt einfach mal so geschrieben:
Java:
public void stopServer(){
                for (Teilnehmer target : TeilnehmerListe.chatTeilnehmer) {
			target.serverConnectionHandler.sendToClient("disconnect:ok");
		}
		for (Teilnehmer target : TeilnehmerListe.chatTeilnehmer) {
			target.serverConnectionHandler.interrupt();
		}
		
		try {
			serverSocket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
Die erste for-each-Schleife sendet disconnect:eek:k und sobald die clients das empfangen schließen sie ihre sockets und in und outputs
und die zweite soll dann halt die connectionhandler interrupten. Kann man das einfach so machen oder is da noch ein fehler drin?


Vielen dank aber schonmal für die Antworten!:toll:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T ServerSocket.accept Rückgabetyp casten Netzwerkprogrammierung 3
G ServerSocket.accept() überschreibt IP-Adresse Netzwerkprogrammierung 4
C serversocket.accept() klappt nicht Netzwerkprogrammierung 10
M ServerSocket.accept() abbrechen Netzwerkprogrammierung 8
dayaftereh serverSocket.accept(); Wecken Netzwerkprogrammierung 2
E Custom E Mail Adresse mithilfe Serversocket oder ähnliches Netzwerkprogrammierung 21
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
D ServerSocket - Socket Verbindungsart Netzwerkprogrammierung 3
J 1 Socket - 2 Serversocket Netzwerkprogrammierung 4
J Client - Serversocket Netzwerkprogrammierung 1
Seikuassi Socket ServerSocket mehrmals erzeugen Netzwerkprogrammierung 1
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
J ServerSocket sauber beenden Netzwerkprogrammierung 3
TheJavaKid ServerSocket beendet mit PuTTy Netzwerkprogrammierung 9
P Socket Daten senden mit ServerSocket? Netzwerkprogrammierung 2
4 Socket Kann kein ServerSocket erstellen Netzwerkprogrammierung 4
D Socket ServerSocket Push Netzwerkprogrammierung 5
Tobse HTTP ServerSocket HTTP Netzwerkprogrammierung 4
X FAQ Frage - Netzwerkgrundlagen - ServerSocket und Socket Netzwerkprogrammierung 4
M Wahrnehmen, dass ServerSocket geschlossen wurde Netzwerkprogrammierung 14
T ServerSocket bleibt beim lesen von Input hängen Netzwerkprogrammierung 2
Schandro Herausfinden ob hinter einem Port bereits ein ServerSocket steckt Netzwerkprogrammierung 2
2 Class mit ServerSocket erbt von Thread? Netzwerkprogrammierung 3
T Java Socket und ServerSocket über Internet-IP? Netzwerkprogrammierung 9
G Frage zu Serversocket-Beispiel aus der FAQ Netzwerkprogrammierung 17
D Komisches Fenster bei Serversocket Netzwerkprogrammierung 2
M Kommunikation zwischen ServerSocket und Socket Netzwerkprogrammierung 2
F ServerSocket im internet zugänglich machen Netzwerkprogrammierung 15
H ServerSocket -> Zugriff nur von localhost Netzwerkprogrammierung 6
P Serversocket schmeißt immmer EOFEXCEPTION Netzwerkprogrammierung 2
A serversocket soll anfrage vom handy entgegennehmen Netzwerkprogrammierung 4
P Problem mit Socket und ServerSocket Netzwerkprogrammierung 2
S ServerSocket merkt nicht, wenn keiner mehr da ist Netzwerkprogrammierung 8
J ServerSocket vs. DatagramSocket Netzwerkprogrammierung 2
A ServerSocket prinzipielle Frage Netzwerkprogrammierung 5
D Problem ServerSocket global Netzwerkprogrammierung 3
J ServerSocket schließen / öffnen im Programmverlauf Netzwerkprogrammierung 4
G einfache Frage zu ServerSocket ... Netzwerkprogrammierung 5
R Socket bei server.accept(); gehts nicht weiter Netzwerkprogrammierung 2
C Socket Identifikation des clients nach der accept() Methode Netzwerkprogrammierung 2
G "Address already in use" accept() abbrechen? Netzwerkprogrammierung 4
X Java6 - RMI - "SocketTimeoutException: Accept timed out Netzwerkprogrammierung 6
J Socket.Accept() unterbrechen? Netzwerkprogrammierung 7
J server.accept() Netzwerkprogrammierung 10
N Server accept-Methode zeitlich begrenzen Netzwerkprogrammierung 2
M den Server aus seinem accept-Zustand holen Netzwerkprogrammierung 3
J server.accept() unterbrechen Netzwerkprogrammierung 10
Dit_ FTP FTP | Datentransfer unterbrechen Netzwerkprogrammierung 3
M Ist es möglich die DSL-Router Verbindung zu unterbrechen? Netzwerkprogrammierung 5
T Lauschen unterbrechen Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben