# einfacher server ohne threads



## lies (29. Mrz 2011)

hallo zusammen,

ich bin neu in der netzwerkprogrammierung und versuche einen einfachen server ohne threads zu implementieren. der server soll lauschen bis sich ein client verbindet. der client schreibt text über das netz und wird beim server ausgegeben. das klappt auch so weit. das problem bei meiner methode ist, trennt sich der client kann sich kein neuer client verbinden. anbei mal meine startServer methode:

```
public void startServer() {
        System.out.println("Server run on port " + getPort());
        boolean loop = true; 
        try {
            serverSocket = new ServerSocket(getPort());
            clientSocket = serverSocket.accept();
            DataInputStream in = null;
            String message = "";
            while (loop) {
                
                try {
                    if (clientSocket.isConnected()) {
                        in = new DataInputStream(clientSocket.getInputStream());
                        message = in.readLine();
                        System.out.println(message);
                    } else {
                        in.close();
                        clientSocket = serverSocket.accept();
                    }
                } catch (IOException e) {
                    System.out.println(e);
                } 
            }
        } catch (IOException e) {
            System.out.println(e);
        }
    }
```
irgendwie muss ich versuchen in der while schleife zu bleiben und clientSocket = serverSocket.accept(); neu aufzurufen. schreibe ich diese zeile direkt in while schleife gibt der server nur die erste textzeile aus. ich brauche eine abfrage die mir true oder false liefert, wenn sich der client vom server getrennt hat. vielleicht habt ihr ein paar ideen. wäre für hilfe dankbar....

gruß patrick


----------



## Michael... (29. Mrz 2011)

In der Konstellation kann sich immer nur ein Client mit dem Server verbinden.
Man könnte eine zweite Schleife ganz aussen rum bauen, dann könnte sich - sobald die Verbindung mit dem aktuellen Client beendet ist - der nächste Client mit dem Server verbinden.
Die bestehende while Schleife muss dafür aber beendet werden können.

Es kann aber weiterhin nur ein Client gleichzeitig mit dem Server kommunizieren.


----------



## lies (30. Mrz 2011)

hi michael,

das ist auch so gewollt das sich immer nur ein client verbinden kann. ich brauche irgendwie eine abfrage die mir signalisiert ob der socket noch verbunden ist oder nicht. habe das auch schon mit isBound() und isConnected() versucht. das problem ist, wenn ich den client (meinetwegen telnet) beende, kommen trotzdem im in stream null an. irgendwie müßte ich den in stream schliessen, um dann wieder zu lauschen.....

gruß patrick


----------



## despikyxd (31. Mrz 2011)

ähm .. lies dir bitte erstmal die doc zu ServerSocket.accept() durch ...
darin steht unter anderem das diese methode so lange blockiert bis sich ein neuer client verbindet
ganz simples beispiel einfach mal ausm kopf dierekt geschrieben


```
public class Example
{
	public static void main(String[] args) throws Exception { new Example(); }
	public Example() throws Exception
	{
		ServerSocket ss=new ServerSocket(12345);
		while(true)
		{
			Socket cs=ss.accept();
			InputStream in=cs.getInputStream();
			OutputStream out=cs.getOutputStream();
			//code ...
			in.close();
			out.close();
			cs.close();
		}
	}
}
```

es reicht nunmal nicht nur einen der beiden streams zu schließen ... es müssen beide streams und der socket selbst geclosed werden ... das accept beim ersten mal vor den loop und dann ans ende zu schreiben ist echt toaler schwachsinn ... schließlich willst du doch mit der grade eingegangenen verbindung arbeiten ... also das ACCEPT erstmal GANZ an den anfang ... DANN beide streams rausziehen ... und DANN erst den worker-loop starten ... und wenn der beendet is die streams und den socket closen ...


----------



## Tomate_Salat (1. Apr 2011)

Wenn man schon mit der doc argumentiert ;-) :
Socket (Java Platform SE 6)



> Closing this socket will also close the socket's InputStream and OutputStream.


ein explizites closen der Streams ist also nicht notwendig.



> accept beim ersten mal vor den loop und dann ans ende zu schreiben ist echt toaler schwachsinn ... schließlich willst du doch mit der grade eingegangenen verbindung arbeiten ...


naja, könnte man friedlicher formulieren. Wieso sollte er mit einer geschlossenen Verbindung arbeiten wollen? server.accept() wird hier nur aufgerufen, wenn keine Verbindung mehr besteht. Man könnte aber i.d.T auf den client-socket noch ein close() aufrufen.

OT: Aber hey, :toll: du fängst endlich mal an dich an Konventionen zu halten. :applaus:


----------

