lesen vom Client geht nicht

  • Themenstarter Themenstarter michael p.
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

michael p.

Gast
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
Code:
	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
Code:
	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
Code:
//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
 
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:
Code:
    String s;
     try
     {
       while ((s = in.readLine()) != null)
          System.out.println ("> " + s);
     }
 
sorry hab im Beitrag über diesem hier meinen Namen nicht geschrieben 😳
 
Code:
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
 
ja aber readLine() gibt doch einen String zurück ? Eclipse gibt da bei mir sofort einen Fehler aus.
Habs in
Code:
while ((line = input.readLine())!=null)
umgewandelt, aber funktioniert auch nicht ???:L
Es kommt immer noch der selbe Fehler [/code]
 
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
Code:
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.
 
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
Code:
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.
 
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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben