Warum lässt sich mein Server und mein Client einfach nicht schließen?!?!

Prengepower

Aktives Mitglied
Moin!

Ich hab nen Client und nen Server gebaut - funzt auch alles bestens aber das Problem ist, dass ich den einfach nicht beendet bekomme - warum?

Java:
	public void startServer(){
		try{
			de.hwrberlin.jemm.handlers.Einstellungen.einstellungen_laden();
			port = new de.hwrberlin.jemm.Activator().user.port;
			ServerSocket server = new ServerSocket(port);
			
			InetAddress addr = InetAddress.getLocalHost();
			System.out.println("Server auf "+addr.getHostName()+"/"+addr.getHostAddress()+":"+port+" gestartet ...");			
			while(true){
				Socket client = server.accept();
				new MultiThread(client).start();
			}
		}catch (IOException e){
			System.err.println(e);
		}
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		new Server().startServer();
	}

Java:
	public void login(String host,int port) throws IOException{
		de.hwrberlin.jemm.handlers.Einstellungen.einstellungen_laden();
		name = de.hwrberlin.jemm.Activator.user.name;
		int rot = de.hwrberlin.jemm.Activator.user.farbe.getRed();
		int green = de.hwrberlin.jemm.Activator.user.farbe.getGreen();
		int blue = de.hwrberlin.jemm.Activator.user.farbe.getBlue();
		
		socket = new Socket(host,port);
		in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		
		out.write(name+"&%"+rot+","+green+","+blue);
		out.newLine();
		out.flush();
		
		login = true;
		
		t = new Thread(this);
		t.start();
	}
	
	public void logout(){
		if (login){
			try{
				login=false;
				t = null;
				if (socket != null){
					socket.close();
				}
				if (in != null){
					in.close();
				}
				if (out != null){
					out.close();
				}
			}catch (IOException e){
				System.err.println(e);
			}
		}
	}

Ja und jetzt noch jeweils wo ichs starte bzw beende...

Java:
btnConnect = new Button(composite, SWT.NONE);
				btnConnect.addSelectionListener(new SelectionAdapter() {
					@Override
					public void widgetSelected(SelectionEvent e) {
						if (connection==false){
							try {
								if (text.getText().length()==0){
									text.setBackground(new Color(null, 255,153,153));
								}else{
									if (text_1.getText().length()==0){
										text.setBackground(new Color(null, 255,255,255));
										text_1.setBackground(new Color(null, 255,153,153));
									}else{
										new de.hwrberlin.jemm.net.Client().login(text.getText(),Integer.valueOf(text_1.getText()).intValue());
										lblStatus.setText("Verbindung hergestellt");
										btnHostSein.setEnabled(false);
										text.setEnabled(false);
										text_1.setEnabled(false);
										connection = true;
										btnConnect.setText("Trennen");
										text.setBackground(new Color(null, 255,255,255));
										text_1.setBackground(new Color(null, 255,255,255));
										PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("de.hwrberlin.jemm.views.editor");
										PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("de.hwrberlin.jemm.views.chatfenster");
										PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("de.hwrberlin.jemm.views.user");
										Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell().setSize(1024, 768);
									}
								}
								
							} catch (IOException e1) {
								// TODO Auto-generated catch block
								JOptionPane.showMessageDialog(new Frame(), e1.toString());
							} catch (PartInitException e2) {
								// TODO Auto-generated catch block
								JOptionPane.showMessageDialog(new Frame(), e2.toString());
							}
						}else{
							new de.hwrberlin.jemm.net.Client().logout();
							lblStatus.setText("");
							btnHostSein.setEnabled(true);
							text.setEnabled(true);
							text_1.setEnabled(true);
							connection = false;
							btnConnect.setText("Verbinden");
						}
					}
				});
				btnConnect.setBounds(116, 54, 68, 23);
				btnConnect.setText("Verbinden");

Java:
btnHostSein = new Button(composite, SWT.NONE);
				btnHostSein.addSelectionListener(new SelectionAdapter() {
					@Override
					public void widgetSelected(SelectionEvent e) {
						if (connection==false){
							server.start();
							try {
								de.hwrberlin.jemm.handlers.Einstellungen.einstellungen_laden();
								new de.hwrberlin.jemm.net.Client().login("localhost",new de.hwrberlin.jemm.Activator().user.port);
								
								InetAddress addr = InetAddress.getLocalHost();
								
								lblStatus.setText(addr.getHostName()+"/"+addr.getHostAddress()+" : "+new de.hwrberlin.jemm.Activator().user.port);
								btnConnect.setEnabled(false);
								text.setEnabled(false);
								text_1.setEnabled(false);	
								connection = true;
								btnHostSein.setText("Unhosten");
								PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("de.hwrberlin.jemm.views.editor");
								PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("de.hwrberlin.jemm.views.chatfenster");
								PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("de.hwrberlin.jemm.views.user");
								Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell().setSize(1024, 768);
								if (de.hwrberlin.jemm.Activator.mail.show){
									new de.hwrberlin.jemm.popup.Mail().setVisible(true);
									de.hwrberlin.jemm.popup.Mail.mailText(addr.getHostAddress()+":"+new de.hwrberlin.jemm.Activator().user.port);
								};
							} catch (IOException e1) {
								// TODO Auto-generated catch block
								JOptionPane.showMessageDialog(new Frame(), e1.toString());
							} catch (PartInitException e2) {
								// TODO Auto-generated catch block
								JOptionPane.showMessageDialog(new Frame(), e2.toString());
							}
						}else{
							new de.hwrberlin.jemm.net.Client().logout();
							lblStatus.setText("");
							btnConnect.setEnabled(true);
							text.setEnabled(true);
							text_1.setEnabled(true);
							btnHostSein.setText("Hosten");
							connection = false;
						}
					}
				});
				btnHostSein.setBounds(10, 54, 68, 23);
				btnHostSein.setText("Hosten");
 

Paddelpirat

Bekanntes Mitglied
Hi,
hab mir dein Programm jetzt nicht komplett angesehen, aber spontan würd ich behaupten, dass das Probem an der
Code:
while
-Schleife in der
Code:
startServer
-Methode liegt. Ersetz das
Code:
true
mal durch einen boolean (z.b.
Code:
isStarted
), den du beim Beenden des Servers auf
Code:
false
setzt.
 

Prengepower

Aktives Mitglied
Hi,
hab mir dein Programm jetzt nicht komplett angesehen, aber spontan würd ich behaupten, dass das Probem an der
Code:
while
-Schleife in der
Code:
startServer
-Methode liegt. Ersetz das
Code:
true
mal durch einen boolean (z.b.
Code:
isStarted
), den du beim Beenden des Servers auf
Code:
false
setzt.

Stimmt das könnte ich mal probieren. Und wie trenne ich den client?
 

Prengepower

Aktives Mitglied
Oder brutal (und darauf vertrauen das das Betreibsystem/JVM sich ums aufräumen kümmert,) einfach System.exit(0) aufrufen

ja so hab ich das jetzt auch eingestellt - find ich aber absolut nicht schön so!
Mit dem logout() hab ich das auch so versucht aber ist ein wenig komisch, dass ich trotzdem noch nachrichten empfange und senden kann - sprich die verbindung ist scheinbar noch da o_O

Hab das jetzt versucht while(isRunning)... und naja dann von extern wollte ich mit setRunning isRunning auf false setzen... Setzen kann ich auch aber server läuft trotzdem weiter -.-
 
Zuletzt bearbeitet:

Prengepower

Aktives Mitglied
ja so hab ich das jetzt auch eingestellt - find ich aber absolut nicht schön so!
Mit dem logout() hab ich das auch so versucht aber ist ein wenig komisch, dass ich trotzdem noch nachrichten empfange und senden kann - sprich die verbindung ist scheinbar noch da o_O

Hab das jetzt versucht while(isRunning)... und naja dann von extern wollte ich mit setRunning isRunning auf false setzen... Setzen kann ich auch aber server läuft trotzdem weiter -.-

also ich habs net hinbekommen und leider jetzt keine zeit mehr -.- habs jetzt halt so gemacht das das programm neustartet! ist nicht schön, aber selten ^^
 
T

tuxedo

Gast
Hab das jetzt versucht while(isRunning)... und naja dann von extern wollte ich mit setRunning isRunning auf false setzen... Setzen kann ich auch aber server läuft trotzdem weiter -.-

Das Problem ist dass accept() blockiert. Du müsstest ein Timeout auf dem Socket für das Accept() setzen, so dass Accept regelmäßig durchläuft und somit die Abbruchbedingung für die While-Schleife greifen kann.

Hin und wieder mal die API Doc anschauen hilft ....

- Alex
 
T

tuxedo

Gast
Wenn das genauso gut funktioniert wie dein "ich hab den classpath richtig gesetzt", dann funktioniert's nicht ;-)

Lass mal sehen wie du das Timeout gesetzt hast.

- Alex
 

Prengepower

Aktives Mitglied
Wenn das genauso gut funktioniert wie dein "ich hab den classpath richtig gesetzt", dann funktioniert's nicht ;-)

Lass mal sehen wie du das Timeout gesetzt hast.

- Alex

haha ^^

Java:
	private final static int TIMEOUT = 600000;
	private static Socket client;
	private String name;
	private BufferedReader in;
	private PrintWriter out;
	public String clientAddr;
	public static Benutzer[] userlist = new Benutzer[1000];
	
	public MultiThread(Socket client){
		this.client = client;
	}
	
	public void run(){
		clientAddr = client.getInetAddress().getHostAddress();
		int clientPort = client.getPort();
		
		try{
			client.setSoTimeout(TIMEOUT);
			
			in = new BufferedReader(new InputStreamReader(client.getInputStream()));
			out = new PrintWriter(client.getOutputStream(),true);
			
			login();
			System.out.println("Verbindung zu "+clientAddr+":"+clientPort+" aufgebaut: "+name);
			
			String message = null;
			while((message = in.readLine()
 
T

tuxedo

Gast
Siehst du? Ich wusste es. Du setzt den Timeout nicht korrekt.

Überleg mal WO der Timeout wichtig ist? Genau. Da wo
Code:
accept()
stattfindet. Und auf welchem Socket geschiet das? Richtig. Auf dem Serversocket.

Muss ich noch mehr sagen?! :D

- Alex

P.S. Ich kenn das selbst. Manchmal sieht man den Wald vor lauter Bäumen nicht mehr...:oops:
 

Prengepower

Aktives Mitglied
Siehst du? Ich wusste es. Du setzt den Timeout nicht korrekt.

Überleg mal WO der Timeout wichtig ist? Genau. Da wo
Code:
accept()
stattfindet. Und auf welchem Socket geschiet das? Richtig. Auf dem Serversocket.

Muss ich noch mehr sagen?! :D

- Alex

P.S. Ich kenn das selbst. Manchmal sieht man den Wald vor lauter Bäumen nicht mehr...:oops:

naja hätte gedacht das das richtig is, weil ich des aus nem Buch Client-Server Masterkurs von nem Prof. hab.. Aber naja da lag i wohl falsch... jetzt ists leider aber auch zu spät :(
 
T

tuxedo

Gast
Der Aufruf ansich ist ja auch korrekt. Nur hast du's am falschen Socket aufgerufen :)

Da wo du's aufgerufen hast machts nur in wenigen Fällen Sinn.

- Alex
 
T

tuxedo

Gast
Mir scheint du stehst auf der Leitung ...


Java:
ServerSocket server = new ServerSocket(port);
server.setSoTimeout(TIMEOUT);
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Socket [Anfänger] BufferedReader.readLine() lässt sich Zeit Netzwerkprogrammierung 1
F FTP FTPClient Datei lässt sich nicht öffnen Netzwerkprogrammierung 4
G InputStreamReader lässt TCP-Connection offen Netzwerkprogrammierung 9
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
I Swing hängt sich auf bei Verbindung zum Server Netzwerkprogrammierung 3
B udp erkennen um welches objekt es sich handelt / max size Netzwerkprogrammierung 5
H RMI Stubs and Skeletons lassen sich nicht erstellen Netzwerkprogrammierung 4
H Socket Client server,verbindung läst sich nicht abbauen&code optimierung Netzwerkprogrammierung 3
C komisches Problem / ObjectInputStream erstellt sich nicht Netzwerkprogrammierung 5
M httpclient kann sich nicht auf asp.net Seite anmelden Netzwerkprogrammierung 2
& RMI Server beendet sich selbst Netzwerkprogrammierung 6
A RMI: Wieviele Clients können sich gleichzeitig anmelden? Netzwerkprogrammierung 34
N Wer kennt sich aus mit ssh (ganymed ssh lib) Netzwerkprogrammierung 2
D Server schliesst sich automatisch mit Client Netzwerkprogrammierung 3
G Vector aktualisiert sich nicht? Netzwerkprogrammierung 6
TRunKX Threads beenden sich selber? Netzwerkprogrammierung 6
D DynDNS-Adresse ändert sich während Server pollt Netzwerkprogrammierung 2
Messoras Launcher für mein Spiel Netzwerkprogrammierung 7
M Wo ist mein Fehler ? o: Netzwerkprogrammierung 4
C Über welchen Netzwerkadapter kommt mein receive? Netzwerkprogrammierung 15
lacyuu Warum empfängt mein Stream keinen Input? Netzwerkprogrammierung 4
T Wieso ist mein Objekt leer? Netzwerkprogrammierung 6
G server für mein spiel. Netzwerkprogrammierung 5
A mein Code compiliert nicht! Netzwerkprogrammierung 2
R Mein FileTransfer Programm Netzwerkprogrammierung 12
T Proxy will einfach nicht mein prog akzeptieren Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben