TCP Verbindung Byte-weise lesen?

MikeThomson

Mitglied
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:

Java:
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
 
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.

Java:
String zuSendendeNachricht = "HalloServer" + '\u0000';
 
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?
 
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
 
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);
}
}
 

Zurück
Oben