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



## Prengepower (13. Dez 2009)

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?


```
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();
	}
```


```
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...


```
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");
```


```
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 (13. Dez 2009)

Hi,
hab mir dein Programm jetzt nicht komplett angesehen, aber spontan würd ich behaupten, dass das Probem an der 
	
	
	
	





```
while
```
-Schleife in der 
	
	
	
	





```
startServer
```
-Methode liegt. Ersetz das 
	
	
	
	





```
true
```
 mal durch einen boolean (z.b. 
	
	
	
	





```
isStarted
```
), den du beim Beenden des Servers auf 
	
	
	
	





```
false
```
 setzt.


----------



## Prengepower (13. Dez 2009)

Paddelpirat hat gesagt.:


> Hi,
> hab mir dein Programm jetzt nicht komplett angesehen, aber spontan wÃ¼rd ich behaupten, dass das Probem an der
> 
> 
> ...



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


----------



## Paddelpirat (13. Dez 2009)

Prengepower hat gesagt.:


> Und wie trenne ich den client?


Indem du ein 
	
	
	
	





```
logout()
```
 bei dir aufrufst? Damit schliest du doch den Socket und die Verbindung ist weg.


----------



## Empire Phoenix (14. Dez 2009)

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


----------



## Prengepower (14. Dez 2009)

Empire Phoenix hat gesagt.:


> 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 

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


----------



## Prengepower (14. Dez 2009)

Prengepower hat gesagt.:


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


----------



## tuxedo (15. Dez 2009)

Prengepower hat gesagt.:


> 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


----------



## Prengepower (15. Dez 2009)

tuxedo hat gesagt.:


> 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



hab aber nen timeout drin... i glaub 10000...


----------



## tuxedo (15. Dez 2009)

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 (15. Dez 2009)

tuxedo hat gesagt.:


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


```
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()
```


----------



## tuxedo (15. Dez 2009)

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

Überleg mal WO der Timeout wichtig ist? Genau. Da wo 
	
	
	
	





```
accept()
```
 stattfindet. Und auf welchem Socket geschiet das? Richtig. Auf dem Serversocket. 

Muss ich noch mehr sagen?! 

- Alex

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


----------



## Prengepower (15. Dez 2009)

tuxedo hat gesagt.:


> Siehst du? Ich wusste es. Du setzt den Timeout nicht korrekt.
> 
> Überleg mal WO der Timeout wichtig ist? Genau. Da wo
> 
> ...



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


----------



## tuxedo (18. Dez 2009)

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


----------



## Prengepower (19. Dez 2009)

tuxedo hat gesagt.:


> 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



mmh okay und wie wärs denn richtig?


----------



## tuxedo (19. Dez 2009)

Mir scheint du stehst auf der Leitung ...



```
ServerSocket server = new ServerSocket(port);
server.setSoTimeout(TIMEOUT);
```


----------



## Prengepower (19. Dez 2009)

mmh stimmt wohl ^^ aber danke


----------

