# TCP Verbindung Byte-weise lesen?



## MikeThomson (6. Jan 2015)

Hallo,

ich bin blutiger Anfänger in Java und stehe gerade total auf dem Schlauch. Ich soll einen kleinen Client programmieren, der sich zuerst an einem Server anmeldet und danach permanent alle Daten des Server's ließt. 

Der Server schickt unregelmäßig Telegramme. Ein Telegramm besteht aus einem  einem Null-terminierten String (nur ASCII-Zeichen mit 0x00 als Trenner zwischen den Telegrammen). ANSI Encoding 1252

Zuerst muss sich der Client an dem Server anmelden. Dazu soll er ein "HalloServer<0x00>" an den Server schicken. Der Server antwortet darauf mit beliebigen Telegrammen z.B. "HalloClient<0x00>", die jeweils durch das 0x00 terminiert werden. 

Soweit die Theorie.

Das ist derzeit mein Client:


```
import java.io.*;

 public class Client {
     public static void main(String[] args) {
    Client client = new Client();
    try {
        client.test();
    } catch (IOException e) {
        e.printStackTrace();
    }
     }
     void test() throws IOException {
    String ip = "192.168.1.1"; // localhost
    int port = 7009;
    java.net.Socket socket = new java.net.Socket(ip,port); // verbindet sich mit Server
    String zuSendendeNachricht = "HalloServer0x00";
    schreibeNachricht(socket, zuSendendeNachricht);
    while (true){
        String empfangeneNachricht = leseNachricht(socket);
        System.out.println(empfangeneNachricht);
        }
     }

     void schreibeNachricht(java.net.Socket socket, String nachricht) throws IOException {
     PrintWriter printWriter =
        new PrintWriter(
        new OutputStreamWriter(
            socket.getOutputStream()));
    printWriter.print(nachricht);
    printWriter.flush();
    }

    String leseNachricht(java.net.Socket socket) throws IOException {
    BufferedReader bufferedReader =
        new BufferedReader(
        new InputStreamReader(
            socket.getInputStream()));
    char[] buffer = new char[200];
        int anzahlZeichen = bufferedReader.read(buffer, 0, 200); // blockiert bis Nachricht empfangen
        String nachricht = new String(buffer, 0, anzahlZeichen);
        System.out.println(nachricht);
    }
 }
```

Ich verstehe derzeit nicht recht, was ich falsch mache. Der Server antwortet jedoch nicht. Daneben bin ich mir nicht sicher, ob ich die Antwort des Servers überhaupt richtig auslese und ausgeben. Wie bekomme ich mit wie lang die Nachricht ist? Ich müsste doch eigentlich jedes Zeichen einzeln lesen oder? Aber wie? Wie bekomem ich es hin, dass Client hier permanent ließt und z.B. bei einem Verbindungsproblem wieder ein "HalloServer<0x00>" schickt?

Irgendwie stehe ich mit den Sockets auf Kriegsfuß.

Danke für eure Hilfe

Gruß

Mike


----------



## Tobse (6. Jan 2015)

Du hast die Aufgabe nicht ganz verstanden  Das <0x00> Soll nicht heissen, dass du tatsächelich 0x00 an den Server schickst (so wie du es tust: String zuSendendeNachricht = "HalloServer0x00") sondern dass auch du einen 0-terminierten String senden musst.


```
String zuSendendeNachricht = "HalloServer" + '\u0000';
```


----------



## MikeThomson (6. Jan 2015)

Jetzt wird es etwas klarer. Nur wie lese ich jetzt die Antwort richtig aus? Ich müsste ja jetzt jedes Zeichen einzeln lesen bis ein '\u0000' kommt oder? Wie lese ich denn die Nachricht Zeichen für Zeichen?


----------



## Tobse (6. Jan 2015)

Richtig, so musst du das machen.

Die Reader und Printer sind bei Text ziemlich angenehm. Wenn es aber um einzelne Bytes geht bist du mit den read und write methoden der Input/Output Streams am besten geholfen. Siehe InputStream#read


----------



## MikeThomson (6. Jan 2015)

Ok, liege ich dann damit richtig?
i ist ein Byte welches ich einfach mittels (char) in ein Zeichen konvertieren kann oder?


is = new InputStream(socket.getInputStream());
String message = "";
while((i=is.read())!=-1){
            // converts integer to character
            c=(char)i;
            if (i != '\u0000'){
              message += (char)i
            }else{
               System.out.println("Message Complete: "+message);
            }
         }


----------



## Tobse (6. Jan 2015)

das sollte so funktionieren. nichts desto trotz wäre es besser auf i == 0 anstadt c == '\u0000' zu prüfen.


----------

