# BufferedInputStream#read



## The_S (27. Mrz 2006)

Hi,

mein Server empfängt von einem Client Daten mittels einem BufferedInputStream.


```
BufferedInputStream buffy = new BufferedInputStream(client.getInputStream());
while (!client.isClosed()) {
	while ((curChar = buffy.read()) != -1) {
		readIn = new StringBuilder();
		readIn.append((char)curChar);
		while ((curChar = buffy.read()) != -1) {
			readIn.append((char)curChar);
			System.out.print((char)curChar);
			System.out.println(curChar);
		}
		message = readIn.toString();
		System.out.println(message);
// andere Sachen
}
```

In der dritten While Schleife wird noch alles korrekt ausgegeben. Er springt auch raus sobald -1 zurückgegeben wird. Nur springt er da dann scheinbar auch aus der 2. Schleife raus, weil das System.out.println(message) und alle nachkommenden Befehle einfach ignoriert werden. Steh da grad ein wenig auf dem Schlauch ...  ???:L


----------



## Sky (27. Mrz 2006)

Hast Du mal einen Debugger mitlaufen lassen ?


----------



## The_S (27. Mrz 2006)

Nö, kann man das auch ohne zusätzliche Tools? Bin hier auf das nötigste beschränkt (JDK und Notepad  :x ) und kann auch nichts installieren ...


----------



## Sky (27. Mrz 2006)

hast Du einen jdb ?

siehe auch http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/jdb.html


----------



## André Uhres (27. Mrz 2006)

In ..\jdk..\bin findest du die jdb Application.
Hab nur keine Erfahrung damit.


----------



## The_S (27. Mrz 2006)

jup, hab ich. Habs auch gefunden. Versuch mich gerade ein wenig durchzuwursteln ... Bis jetzt ist das dabei rausgekommen:



			
				jdb hat gesagt.:
			
		

> main[1] step
> >
> Step completed: "thread=main", Server.acceptClients(), line=44 bci=87
> 44                                                              while ((curChar= buffy.read()) != -1) {
> ...



Das sind jetzt mal die zwei letzten Durchläufe bevor er nichts mehr macht. Hilft mir jetzt net sonderlich viel weiter, wüsste auch nicht was ich sonst noch überprüfen sollte ...

Das merkwürdige ist (habs ma mit System.out.println's gestestet), dass er sich weder in der Ersten, noch in der Zweiten noch in der Dritten Schleife befindet ...


----------



## André Uhres (27. Mrz 2006)

Er scheint aus dem letzten _buffy.read()_ nicht mehr zurückzukommen..


----------



## The_S (27. Mrz 2006)

hm, klingt logisch ... aber:

1. Wie kann das sein?
2. Was kann ich dagegen machen?  :bae:


----------



## Stiewen (27. Mrz 2006)

Aloa Leutz,

also... Leutz, ... ich mag ja nicht hochnäsig klingen oder so ... kann ja auch sein, dass ich was falsch verstanden oder gelesen hab, aber wenn man mal so nen bissel code weglässt...

```
while (!client.isClosed()) {
   while ((curChar = buffy.read()) != -1) {
      while ((curChar = buffy.read()) != -1) {
      ...
      }
...
}
```
dann ist doch logisch, dass er aus allen raus geht, denn -1 wird doch nur übertragen, wenn das Socket geschlossen wurde... also sind die beiden inneren Schleifen false und die äußere dann auch, denn das Socket is zu...

berichtigt mich bitte, wenn ich falsch liege...

THX, Stiewen


----------



## The_S (27. Mrz 2006)

[edit] Kommando zurück!!!

scheint als müsste man doch den Socket schließen ... *mist* wie kann ich das sonst lösen? Kann keine Reader und Writer verwenden ...  :?


----------



## Stiewen (27. Mrz 2006)

1. stimmte das jetzt, was ich sagte?
2. was willst du eigentlich machen? Dateien übertragen? dann wäre das doch so weit erst mal ok ... verbesserungswürdig, aber ok ...


----------



## The_S (28. Mrz 2006)

Hatte gestern ein wenig Erfahrungen mit einem anderen (erfahreneren) Java programmierer ausgetauscht. Dieser meinte, dass der InputStream ja Bytes liest und da Bytes bekanntlich nicht negativ sein können, kann er auch nur -1 zurückgeben wenn der Stream geschlossen wird.

Außerdem hat er gemeint ich solle es mal mit dem ObjectOutputStream/ObjectInputStream versuchen. Sobald ich dazu gekommen bin es zu testen sag ich nochmal bescheid (kann aber dauern  ).

@ Stiewen

jup, will Dateien übertragen.


----------



## Stiewen (28. Mrz 2006)

gib mal die Adresse von dem Typen! :-D

na, das hat mir aber auch schon mal einer erzählt aus diesem Forum, glaube es war ein Admin ...
Also lag ich ja gar nicht mal so falsch ;-) 
Poste doch bitte deinen Source zum Übertragen hier ins Forum ... ich zB. bräuchte sowas auch noch ...

THX
Stiewen


----------



## The_S (28. Mrz 2006)

Stiewen hat gesagt.:
			
		

> Poste doch bitte deinen Source zum Übertragen hier ins Forum ... ich zB. bräuchte sowas auch noch ...



Wie jetzt? Den kompletten Source  :shock: 

oder nur den zur Datenübertragung?

Muss dich aber momentan bei beiden enttäuschen, da ich festgestellt habe, dass es das Beste ist wenn ich mein Prog nochmal komplett neu aufziehe, kann also noch ein wenig dauern .


----------



## Stiewen (28. Mrz 2006)

ach ja... kenn ich doch irgendwoher ;-)

nein, nur die Datenübertragung

was solls denn werden? ein Chatprog mit Datatransfer?

Stiewen


----------



## The_S (28. Mrz 2006)

Stiewen hat gesagt.:
			
		

> was solls denn werden? ein Chatprog mit Datatransfer?



ja, u.a.


----------



## flanker (28. Mrz 2006)

Hi,
warte noch ein wenig mit dem umschreiben 



			
				Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Hi,
> 
> mein Server empfängt von einem Client Daten mittels einem BufferedInputStream.
> 
> ...



So ungefähr, getestet habe nicht.



sollet ebenfalls funktionieren:

```
BufferReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
  System.out.println(inputLine);
  //oder irgendwo hinschreiben
}
in.close();
```

oder so:

```
BufferedInputStream br = new BufferedInputStream(progressIn);
byte[] arr = new byte[br.available() ];
br.read(arr);
br.close();
String txt = new String(arr);
```

ja, und byte hat auch negative werte


----------



## The_S (28. Mrz 2006)

flanker hat gesagt.:
			
		

> Hi,



Hi, danke für die Antwort!



			
				flanker hat gesagt.:
			
		

> warte noch ein wenig mit dem umschreiben



zu spät ... (Außerdem lags nicht nur an der Geschichte)



			
				flanker hat gesagt.:
			
		

> So ungefähr, getestet habe nicht.



Was hast du jetzt großartig anders gemacht, dass deines theoretisch gehen sollte und meines nicht?



			
				flanker hat gesagt.:
			
		

> sollet ebenfalls funktionieren:
> 
> ```
> BufferReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
> ...



Ähm, nein. Ich möchte wie gesagt Dateien versenden, das wird mit nem BufferedReader wohl nicht funktionieren.



			
				flanker hat gesagt.:
			
		

> ja, und byte hat auch negative werte



Es geht hier nicht um das byte als Datentyp in Java, sondern um das Byte als Speichereinheit (sprich 8 Bit)


----------



## flanker (28. Mrz 2006)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> ...
> Was hast du jetzt großartig anders gemacht, dass deines theoretisch gehen sollte und meines nicht?



Kommentare gelesen?
ist eh zu spät...

EDIT:
ja, mit BufferedReader hast du recht, anderen posts habe übersehen, in deinem code ging es um String.


----------



## The_S (28. Mrz 2006)

flanker hat gesagt.:
			
		

> Kommentare gelesen?



Jup, nur was ändert es daran, dass du niemals -1 zurück bekommst?


----------



## flanker (28. Mrz 2006)

```
File outputFile = new File("file.txt");
FileOutputStream out = new FileOutputStream(outputFile);
BufferedInputStream buffy = new BufferedInputStream(client.getInputStream());

int currChar;
while ((curChar = buffy.read()) != -1) {  // hier wird irgendwann -1 geliefert
    out.write(currChar);
}
buffy.close();
out.close();
```


----------



## The_S (28. Mrz 2006)

bitte löschen, hab nen neuen post angefügt, damit ein neuer Beitrag angezeigt wird. Thx


----------



## The_S (28. Mrz 2006)

ok, hab jetzt mal zwei komplette Klassen zum Testen geschrieben:

Server

```
import java.net.*;
import java.io.*;

public class TestServer {
	
	ServerSocket server = null;
	Socket client = null;
	
	public TestServer(int port) throws IOException {
		
		server = new ServerSocket(port);
		listen();
	}
	
	public void listen() throws IOException {
		
		while (true) {
			client = server.accept();
			new Thread(new Runnable() {
				public void run() {
					try {
						Socket cl = client;
						int curChar = 0;
						PrintStream ps = new PrintStream(cl.getOutputStream(), true);
						BufferedInputStream buffy = new BufferedInputStream(cl.getInputStream()); 
						while (!cl.isClosed()) {
							while ((curChar = buffy.read()) != -1) {
								ps.write(curChar);
								System.out.println("Sende " + (char)curChar);
							}
						}
						System.out.println("Socket closed");
					}
					catch (IOException e) {
						e.printStackTrace();
					}
				}
			}).start();
		}
	}
	
	public static void main(String[] args) {
		
		try {
			new TestServer(3456);
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```

Client

```
import java.net.*;
import java.io.*;

public class TestClient {
	
	Socket me = null;
	BufferedInputStream in = null;
	PrintStream out = null;
	
	public TestClient(String host, int port) throws IOException {
		
		me = new Socket(host, port);
		in = new BufferedInputStream(me.getInputStream());
		out = new PrintStream(me.getOutputStream(), true);
		listen();
		write();
	}
	
	public void listen() throws IOException {
		
		new Thread(new Runnable() {
			public void run() {
				try {
					int curChar = 0;
					while (!me.isClosed()) {
						while ((curChar = in.read()) != -1) {
							System.out.print((char)curChar);
						}
						System.out.println("Nichts zu tun");
					}
					System.out.println("Client closed");
				}
				catch (IOException e) {
					e.printStackTrace();
				}
			}
		}).start();
	}
	
	public void write() {
		
		out.print("Hallo, blup");
		System.out.println("gesendet");
	}
	
	public static void main(String[] args) {
		
		try {
			new TestClient("localhost", 3456);
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```

Nachdem ich mich scheinbar verdammt blöd anstelle dein Beispiel umzusetzen, würde ich dich bitten den Beispielcode oben so umzuschreiben das er funktioniert. Danke


----------



## flanker (28. Mrz 2006)

gut, kann aber dauern bis ich zeit dazu habe, sorry.


----------



## The_S (28. Mrz 2006)

lass dir nur Zeit, bin ja eh momentan am Umschreiben, ist deshalb sowieso größtenteils nur der Neugierde wegen!


----------



## flanker (28. Mrz 2006)

also, deine klassen funktionieren im grossen und ganzen,
hier eine minimal geänderte variante:

```
import java.net.*;
import java.io.*;

public class TestServer {

  ServerSocket server = null;
  Socket client = null;

  public TestServer(int port) throws IOException {
    server = new ServerSocket(port);
    listen();
  }

  public void listen() throws IOException {

    while (true) {
      client = server.accept();
      new Thread(new Runnable() {
        public void run() {
          try {
            Socket cl = client;
            PrintStream ps = new PrintStream(cl.getOutputStream(), true);
            BufferedInputStream buffy = new BufferedInputStream(cl.getInputStream());
            int curChar;
            while ((curChar = buffy.read()) != -1) {
              ps.write(curChar);
              System.out.println("Empfange Zeichen: " + (char)curChar);
            }
          }
          catch (IOException e) {
            System.out.println("Client closed");
          }
        }
      }).start();
    }
  }

  public static void main(String[] args) {

    try {
      new TestServer(3456);
    }
    catch (IOException e) {
      e.printStackTrace();
    }
  }
}
```

und zweite:



```
import java.net.*;
import java.io.*;

public class TestClient {

  Socket me = null;
  BufferedInputStream in = null;
  PrintStream out = null;

  public TestClient(String host, int port) throws IOException {

    me = new Socket(host, port);
    in = new BufferedInputStream(me.getInputStream());
    out = new PrintStream(me.getOutputStream(), true);
    listen();
    write();
  }

  public void listen() throws IOException {

    new Thread(new Runnable() {
      public void run() {
        try {
          int curChar = 0;
          while ((curChar = in.read()) != -1) {
            System.out.print((char)curChar);
          }
        }
        catch (IOException e) {
          System.out.println("Server closed");
        }
      }
    }).start();
  }

  public void write() {
    // einige mal senden:
    for (int i = 0; i < 10; i++) {
      System.out.println(" ");
      System.out.println("Sende String: ");
      out.println("Hallo, blup");

      try {
        Thread.sleep(2000); //mal pause einlegen
      }
      catch (Exception ex) {}
    }
    System.out.println("ich habe fertig!");
  }

  public static void main(String[] args) {

    try {
      new TestClient("localhost", 3456);
    }
    catch (IOException e) {
      e.printStackTrace();
    }
  }
}
```


----------



## The_S (28. Mrz 2006)

Leider muss ich dich enttäuschen, auch deine Version sendet niemals -1. Denn wenn dem so wäre, müsste er ja die Schleife verlassen und an dieser Stelle (mit Kommentar markiert) in der TestClient Klasse


```
public void listen() throws IOException { 

    new Thread(new Runnable() { 
      public void run() { 
        try { 
          int curChar = 0; 
          while ((curChar = in.read()) != -1) { 
            System.out.print((char)curChar); 
          }
          System.out.println("Bin durch ..."); // diese Stelle ist gemeint/neuer Code
        } 
        catch (IOException e) { 
          System.out.println("Server closed"); 
        } 
      } 
    }).start(); 
  }
```

"Bin durch" ausgeben. Macht er aber nicht.


----------



## flanker (28. Mrz 2006)

um mal -1 zu sehen, hier die Serverklasse:



```
import java.net.*;
import java.io.*;

public class TestServer {

  ServerSocket server = null;
  Socket client = null;

  public TestServer(int port) throws IOException {
    server = new ServerSocket(port);
    listen();
  }

  public void listen() throws IOException {

    while (true) {
      client = server.accept();
      new Thread(new Runnable() {
        public void run() {
          try {
            Socket cl = client;
            PrintStream ps = new PrintStream(cl.getOutputStream(), true);
            BufferedInputStream buffy = new BufferedInputStream(cl.getInputStream());
            int curChar;
            //while ((curChar = buffy.read()) != -1) {
            while (true) {
              curChar = buffy.read();
              ps.write(curChar);
              System.out.println("Empfange Zeichen: " + (char)curChar + ",   int-wert: " + curChar);
              if (curChar == -1) break;
            }
            System.out.print("Ende der Schleife!");
          }
          catch (IOException e) {
            System.out.println("Client closed");
          }
        }
      }).start();
    }
  }

  public static void main(String[] args) {

    try {
      new TestServer(3456);
    }
    catch (IOException e) {
      e.printStackTrace();
    }
  }
}
```


----------



## The_S (28. Mrz 2006)

Ähm, ja ... und wo ist die Minus 1 jetzt?

Würd gern mal deine Ausgabe auf der Konsole sehen. Hab bei mir kein einziges -1 gesehen und die beiden Streams (Server/Client) hängen sich immernoch auf, wenn das Ende erreicht ist.


----------



## flanker (28. Mrz 2006)

Client:



> Sende String:
> Hallo, blup
> 
> Sende String:
> ...



Server:


> Empfange Zeichen: H,   int-wert: 72
> Empfange Zeichen: a,   int-wert: 97
> Empfange Zeichen: l,   int-wert: 108
> Empfange Zeichen: l,   int-wert: 108
> ...





hier nochmal die klassen:


```
import java.net.*;
import java.io.*;

public class TestClient {

  Socket me = null;
  BufferedInputStream in = null;
  PrintStream out = null;

  public TestClient(String host, int port) throws IOException {

    me = new Socket(host, port);
    in = new BufferedInputStream(me.getInputStream());
    out = new PrintStream(me.getOutputStream(), true);
    listen();
    write();
  }

  public void listen() throws IOException {

    new Thread(new Runnable() {
      public void run() {
        try {
          int curChar = 0;
          while ((curChar = in.read()) != -1) {
            System.out.print((char)curChar);
          }
        }
        catch (IOException e) {
          System.out.println("Server closed");
        }
      }
    }).start();
  }

  public void write() {
    // einige mal senden:
    for (int i = 0; i < 3; i++) {
      System.out.println(" ");
      System.out.println("Sende String: ");
      out.println("Hallo, blup");

      try {
        Thread.sleep(1000); //mal pause einlegen
      }
      catch (Exception ex) {}
    }
    System.out.println("ich habe fertig!");
    out.close();
  }

  public static void main(String[] args) {

    try {
      new TestClient("localhost", 3456);
    }
    catch (IOException e) {
      e.printStackTrace();
    }
  }
}
```




```
import java.net.*;
import java.io.*;

public class TestServer {

  ServerSocket server = null;
  Socket client = null;

  public TestServer(int port) throws IOException {
    server = new ServerSocket(port);
    listen();
  }

  public void listen() throws IOException {

    while (true) {
      client = server.accept();
      new Thread(new Runnable() {
        public void run() {
          try {
            Socket cl = client;
            PrintStream ps = new PrintStream(cl.getOutputStream(), true);
            BufferedInputStream buffy = new BufferedInputStream(cl.getInputStream());
            int curChar;
            //while ((curChar = buffy.read()) != -1) {
            while (true) {
              curChar = buffy.read();
              ps.write(curChar);
              System.out.println("Empfange Zeichen: " + (char)curChar + ",   int-wert: " + curChar);
              if (curChar == -1) break;
            }
            System.out.print("Ende der Schleife!");
          }
          catch (IOException e) {
            System.out.println("Client closed");
          }
        }
      }).start();
    }
  }

  public static void main(String[] args) {

    try {
      new TestServer(3456);
    }
    catch (IOException e) {
      e.printStackTrace();
    }
  }
}
```
[/quote]


----------



## The_S (28. Mrz 2006)

OK, die unterschiedliche Ausgabe kommt daher, dass du im TestClient noch was verändert hast. Du hast den Stream nämlich noch geschlossen. Natürlich bekomm ich so auch die -1, weil dann der Stream zu ist. Aber ich kann nicht einfach den Stream schließen, das schließt den Socket gleich mit und ich muss mich jedesmal neu connecten was nicht Sinn der Sache seien kann und es auch nicht ist.


----------



## flanker (28. Mrz 2006)

ok, ich habe das problem nicht ganz verstanden,
du willst stream offen halten und dabei auch am ende jeder sendung eof(-1) lesen?
wenn ja, muss ich passen, weiss ich nicht ob es geht.


----------



## The_S (29. Mrz 2006)

flanker hat gesagt.:
			
		

> ok, ich habe das problem nicht ganz verstanden,



hab ich mir mittlerweile schon fast gedacht ...  :wink: 



			
				flanker hat gesagt.:
			
		

> du willst stream offen halten und dabei auch am ende jeder sendung eof(-1) lesen?



richtig



			
				flanker hat gesagt.:
			
		

> wenn ja, muss ich passen, weiss ich nicht ob es geht.



macht nichts, trotzdem herzlichen Dank für deine Bemühungen ...  :toll:


----------



## flanker (29. Mrz 2006)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> ...
> macht nichts, trotzdem herzlichen Dank für deine Bemühungen ...  :toll:


Bitte.   
also, zumindest mir hat es was gebracht, ganz umsonst war es doch nicht


----------



## The_S (30. Mrz 2006)

Stiewen hat gesagt.:
			
		

> Poste doch bitte deinen Source zum Übertragen hier ins Forum ... ich zB. bräuchte sowas auch noch ...



Mal das wichtigste ... (ist jetzt aus meiner Applikation gerissen, aber ich denke man versteht was vor sich geht ansonsten einfach fragen  )

Server:

```
public class DataTransferServer {
	
	ServerController sc = null;
	OOSStorage ooss = null; 
	ServerSocket server = null;
	Socket client = null;
	
	public DataTransferServer(ServerController sc, int port) {
		
		try {
			this.sc = sc;
			ooss = new OOSStorage();
			server = new ServerSocket(port);
			listenToPort();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void listenToPort() throws IOException {
		
		while (true) {
			client = server.accept();
			new Thread(new Runnable() {
				public void run() {
					Socket thisClient = client;
					try {
						ooss.add(thisClient, new ObjectOutputStream(thisClient.getOutputStream()));
						ObjectInputStream ois = new ObjectInputStream(thisClient.getInputStream());
						Object obj = null;
						while (!thisClient.isClosed()) {
							if ((obj = ois.readObject()) != null) {
								ooss.getOOS(sc.getClient(obj.toString())).writeObject(ois.readObject());							}
						}
					}
					catch (IOException e) {
						e.printStackTrace();
					}
					catch (ClassNotFoundException e) {
						e.printStackTrace();
					}
				}
			}).start();
		}
	}
}
```

Client:

```
public class DataTransferClient {
	
	DataTransferController controller = null;
	Socket me = null;
	ObjectOutputStream oos = null;
	ObjectInputStream ois = null;
	
	public DataTransferClient(DataTransferController controller, String host, int port) {
		
		try {
			this.controller = controller;
			me = new Socket(host, port);
			oos = new ObjectOutputStream(me.getOutputStream());
			ois = new ObjectInputStream(me.getInputStream());
			listenToPort();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void listenToPort() {
		
		new Thread(new Runnable() {
			public void run() {
				try {
					Object obj = null;
					while (!me.isClosed()) {
						if ((obj = ois.readObject()) != null) {
							controller.handle(obj);
						}
					}
				}
				catch (IOException e) {
					e.printStackTrace();
				}
				catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		}).start();
	}
	
	public void send(Object obj, String name) {
		
		
		try {
			oos.writeObject(name);
			oos.writeObject(obj);
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}
```

[edit] gesendet wird ein Vector<Integer> der die bytes der Datei speichert


----------

