# lesen vom Client geht nicht



## michael p. (2. Jan 2009)

Hallo, frohes neues Jahr euch allen,

ich habe einen Server und einen Clienten für eine Bücherverwaltung
programmiert. Wenn ich dem Server nun den Befehl schicke ein neues Buch zu speichern,
dann startet er die Speicherroutine, aber wenn ich ihm dann das Buch schicke, kriegt der Server
das nicht.


Das was ich nicht verstehe ist, wieso ich ihm das Kommando zum Speichern schicken kann und er es auch bekommt

```
public void writeToServer(int command){
		
		try{
			output.write(command);
			output.write("\n");//->ist immer ein BufferedWriter
			output.flush();
		}
		
		catch(IOException ie){
			
			gui.errorMessage("I/O Verbindung konnte nicht hergestellt werden");
			
		}
	}
```

aber wenn ich ein Buch schreibe nimmt der Server es nicht an

```
public void writeBookToServer(Book book){
		
		try{
			
			output.write(book.toString(),0,book.toString().length());
			output.write("\n");
			output.flush();
		}
		
		catch(IOException ie){
			
			gui.errorMessage("I/O Verbindung konnte nicht hergestellt werden");
		}
		
	}
```


Hier noch die Methoden auf der Serverseite

```
//das geht anscheinend
	public int readFromClient(){
		
		try{
			
			int command=Integer.valueOf(input.read());//-> ist immer ein BufferedReader
			
			return command;
			
		}
		
		catch(IOException ie){
			
			System.out.println("I/O Verbindung konnte nicht hergestellt werden");
			Thread.currentThread().interrupt();
			return -1;
		}
		
		
	}

//und ab hier geht's nicht

	private Book readBook(String b){
		System.out.print("Hallo");
		System.out.println(b);
		String[]bb=b.split("_");
		System.out.print(bb[0]);
		System.out.println(bb.length);
		Book book=new Book();
		book.setAuthor(bb[0]);
		book.setTitle(bb[1]);
		book.setDate_of_publication(new Integer(bb[2]));
		book.setPublisher(bb[3]);
		book.setPrinting(new Integer(bb[4]));
		book.setGenre(bb[5]);
		book.setISBN(new Long(bb[6]));
		book.setKeywords(bb[7]);
		
		return book;
		
	}
	
	public Book readBookFromClient(){
		
		try{
			String b="";
			while((b=input.readLine())==null);
			Book book=readBook(b);
			return book;
		}
		
		catch(IOException ie){
			
			System.out.println("I/O Verbindung konnte nicht hergestellt werden");
			Thread.currentThread().interrupt();
			return null;
			
		}
		
	}
```

Also ich steh zurzeit total auf dem schlauch
kann mir da jemand vielleicht helfen ?

Gruß michael


----------



## musiKk (2. Jan 2009)

Zeile 49 sieht etwas komisch aus. Was soll die denn machen?


----------



## Guest (2. Jan 2009)

ja eigentlich sollte readLine() ja sowieso blockieren,solange da nichts ankommt.
Da das aber ohne while-Schleife nicht funktioniert hat, hab ichs halt mit einer versucht.
Und es geht immer noch nicht, es wird eine ArrayIndexOutOfBoundsException geworfen,
wenn die readBook()-Methode versucht ein Buch-Objekt zu erstellen.
in einem anderen Versuch ging das hier:

```
String s;
     try
     {
       while ((s = in.readLine()) != null)
          System.out.println ("> " + s);
     }
```


----------



## michael p. (2. Jan 2009)

sorry hab im Beitrag über diesem hier meinen Namen nicht geschrieben


----------



## Mentor49 (2. Jan 2009)

```
public Book readBookFromClient()
{
      try
      {
         String line;
         while (line = input.readLine())
         {
           if (line != null)
           {
             break;
           }
         }
         return readBook(line);
      }
      catch(IOException ie)
      {
         System.out.println("I/O Verbindung konnte nicht hergestellt werden");
         Thread.currentThread().interrupt();
         return null;
      }
   }
```
Versuchs mal so ;o


----------



## Guest (3. Jan 2009)

ja aber readLine() gibt doch einen String zurück ? Eclipse gibt da bei mir sofort einen Fehler aus.
Habs in  

```
while ((line = input.readLine())!=null)
```
umgewandelt, aber funktioniert auch nicht  ???:L 
Es kommt immer noch der selbe Fehler [/code]


----------



## musiKk (3. Jan 2009)

Ja, readLine() gibt einen String zurück. Wieso "aber"? Wie lautet der Fehler?


----------



## michael p (3. Jan 2009)

so jetzt hab ich mich angemeldet :autsch:


----------



## michael p (3. Jan 2009)

Hab bloß das Beispiel von Mentor49 versucht und dann gibt mir Eclipse 
zurück, dass String nicht in boolean umgewandelt werden kann

Ansonsten kommt bei mir eine ArrayIndexOutOfBoundsException bei readBook,
das ein Book aus einem String macht, da readBook aus irgendeinem Grund 
nur "" bekommt und der Aufruf von bb[1] u.s.w. größer ist als der Index des Arrays  

```
String[]bb=b.split("_"); 
Book book=new Book();
book.setDateOfPublication(bb[2]);
```

bloß ich verstehe echt nicht, wieso readLine() nicht blockiert.
Denn read() blockiert vorher, da der Server ja vorher über readFromClient() erfolgreich den Befehl bekommt, 
dass ein neues Buch hinzugefügt werden soll.


----------



## musiKk (3. Jan 2009)

michael p hat gesagt.:
			
		

> Hab bloß das Beispiel von Mentor49 versucht und dann gibt mir Eclipse
> zurück, dass String nicht in boolean umgewandelt werden kann


Das stimmt. Da muss in diesem Beispiel ein true rein und das read in den Schleifenkörper. Ich persönlich bevorzuge allerdings die Methode, die du auch verwendet hast, also

```
while ((line = input.readLine())!=null)
```



> bloß ich verstehe echt nicht, wieso readLine() nicht blockiert.
> Denn read() blockiert vorher, da der Server ja vorher über readFromClient() erfolgreich den Befehl bekommt,
> dass ein neues Buch hinzugefügt werden soll.


Ist vielleicht noch das \n, mit dem du deinen Command abschließt, in der Leitung? Ich seh nur ein einzelnes read() bei dir.


----------



## michael p (3. Jan 2009)

ne eigentlich ist "\n" schon drin, hab es in allen möglichen Variationen versucht.
In der 
1. toString-Methode "\n" am Schluss
2. einzeln "\n" nach dem Buch schicken
3. newLine Methode des BufferedReaders.
4. 1. und 2. zusammen

immer kommt ein und der selbe Fehler


----------

