# nicht blockierende einlesen



## youssef (24. Feb 2005)

Hallo,
ich habe einen Client, der in eine unendliche Schleife Verbindungen zum Server aufbaut. in der erste Verbindung schreibt er Daten zum Server und in der nächsten Verbindungen liest nur Daten vom Server aus

auf den Server lese ich aus jede Verbindung die Daten aus und schreibe andere Daten hin aber schon ab der zweite Verbindung sind keine Daten zum lesen vorhanden weil der Client keine Daten schreibt.
die read methode blockiert bis die socket geschlossen wird, deswegen wird bei read() eine exception ausgelöst "Socket closed" 

ich habe mit InputStream.available() versucht das blockieren von read zu vermeiden aber ohne erfolg-> available() <=0

laut java api:
The available method for class InputStream always returns 0. 

This method should be overridden by subclasses.



gibt es eine andere Möglichkeit dieses Problem zu lösen?
wenn ihr code braucht kann ich auch ihn posten
danke im voraus

Gruss
Youssef


----------



## foobar (24. Feb 2005)

> wenn ihr code braucht kann ich auch ihn posten


Immer her damit ;-)


----------



## youssef (25. Feb 2005)

Hallo,
Hier ist der Client


```
.....
boolean flag = false;
for(;;)
          {
           try 
             {
              //Aufbau der Socket Verbindung mit dem Server
              Socket server = new Socket(str, 8888);
              if(flag == false)
                {
                 OutputStream out = server.getOutputStream();
                 DOut = new DataOut(out); //OutThread
                 DOut.start();// Daten werden geschrieben an server
                 Thread.yield();
                 try
                   {
                    Thread.sleep(100);
                   }
                 catch(InterruptedException ie)
                   {ie.printStackTrace();}
                 out.close(); 
                 server.close(); 
                 server = null;
                 DOut = null;
                 flag = true;
                }
              else
                {
                 ....
                 InputStream in = server.getInputStream();
                 DIn  = new DataIn(in); // InThread
                 DIn.start(); // kommende Daten von server werden ausegelsen
                 Thread.yield();
                 try
                   {
                    Thread.sleep(200);
                   }
                 catch(InterruptedException ie)
                   {ie.printStackTrace();}
                 in.close(); 
                 server.close();   
                 server = null;
                 DIn = null;
                                }
             }
           catch (InterruptedIOException e)
             {e.printStackTrace();}
           catch (IOException e)
             {e.printStackTrace();}
          }
        }
```

Der Server

```
while (!tcpbuffer.getStopRequested()) {

	if (isInterrupted()) 
              {
	break;
              }
              try {
	   so = appletsocket.accept(); // Warten auf Verbindung
	   } catch (SocketTimeoutException exc) {
		continue;
	     }

	System.out.println("Verbindung " + i
	+ " vom Client aufgenommen");
	InputStream in = so.getInputStream();
	OutputStream out = so.getOutputStream();
	new InThread(in).start();
	Thread.yield();
	try {
	Thread.sleep(10);
	} catch (InterruptedException e) {
	e.printStackTrace();
	}
                .....
                .....
```

Die Klasse InThread zum Auslesen

```
public void run() {
		try {
			//if (in.available() > 0)
			while ((anz_bytes_read_from_client = in.read(b)) != -1)

				break;
			if (anz_bytes_read_from_client > 0) {
				if (b[0] == 4 && b[1] == 0) // erste Aufruf des Clients-> Abbild
				{
					abbildAnfordern();
					System.out.println("Abbild anfordern");
				}
				else
				{
...........
.......
```
ich hoffe dass das Problem jetzt klar ist
Auf Verbeserungsvorschläge über code , style würde ich mich sehr freuen
Gruss
Youssef


----------

