[Gelöst]ByteBuffer mit Dataoutput/inputStream schreiben/lesen



  • Hi
    Ich versuche ein Packet von einem Server zu einem Client zu schicken, dazu verwende ich einen ByteBuffer in welchem alle Daten enthalten sind die geschickt werden sollen. Um Daten in das Paket zu schreiben verwende ich folgende Konstruktion:

    ByteBuffer buf = ByteBuffer.allocate(1024);
    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    DataOutputStream dOutStream = new DataOutputStream(outStream);
    

    Die Daten werden dann mit dOutputStream.writeUTF("..."); usw gespeichert und am Ende mit

    buf.clear();
    buf.put(outStream.toByteArray());
    

    in den ByteBuffer gepackt, danach werden sie an den Client gesendet:

    channel.write( buf );
    

    Um die Daten im Client wieder auszulesen verwende ich das Gegenstück

    ByteBuffer buf= ByteBuffer.allocate(1024);
    Client.channel.read(buf);
    ByteArrayInputStream inStream= new ByteArrayInputStream(buf.array());
    DataInputStream in = new DataInputStream(inStream);
    

    , die Daten lese ich wieder mit in.readUTF(); usw. aus und hier kommt das Problem: der String ist leer( nicht null sondern "" ).
    wenn ich mir das bytearray ausgeben lasse steht dort im Client zB "[B@1a73d3c", lasse ich mir die Bytes des Strings im Server ausgeben gibt er "[B@1ac3c08" zurück( -> wenn man die bytes im Server wieder in String konvertiert kommt "0" heraus(stimmt also), wenn man sie im Client konvertieren lässt kommt "" heraus ).

    Was mache ich falsch?
    Mfg

    Edit: [Gelöst]-prefix hinzugefügt



  • Ich finds irgendwie ziemlich umständlich, wie du das machst. Warum die vielen Streams? Komisch finde ich folgende Angaben:

    channel.write(buf);
    ...
    Client.channel.read(buf);
    

    Von welchem Typ ist channel? Erwartet channel ein ByteBuffer als Argument? Die meisten Output- und Input-Streams erwarten doch eigentlich ein Byte-Array als Argument. Vielleicht liegt hier ein Fehler. Und wenn du einen String in ein Byte-Array konvertieren willst, warum nutzt du dann nicht folgendes Konstrukt:

    String sendeMich = "sendeMich";
    ByteBuffer buf = ByteBuffer.allocate(1024);
    buf.put(sendeMich.getBytes());
    


  • ersteinmal danke für die schnelle antwort..

    Michamab schrieb:

    Warum die vielen Streams?

    Weil dies nur eine zusammenfassung einer etwas komplexeren Codefragments ist, das hätte ich vllt erwähnen sollen.

    Michamab schrieb:

    Von welchem Typ ist channel?

    Sowohl channel als auch Client.channel sind vom Typ SocketChannel.

    Michamab schrieb:

    Erwartet channel ein ByteBuffer als Argument?

    Ja.

    Und wenn du einen String in ein Byte-Array konvertieren willst, warum nutzt du dann nicht folgendes Konstrukt:

    String sendeMich = "sendeMich";
    ByteBuffer buf = ByteBuffer.allocate(1024);
    buf.put(sendeMich.getBytes());
    

    Weil ich, wie ich ja schon schrieb den Inhalt mit readUTF; readInt etc. auslesen will; ich will also sowohl Stringdaten als auch Zahlen in das Packet inkludieren, der Inhalt wird nacher mittels einer Paket ID wieder ausgelesen.

    Edit:

    Double *T schrieb:

    [...]etwas komplexeren Codefragments[...]

    -> Dort kann die Fehlerquelle aber nicht liegen, der Paketspezifische Teil gleicht dem gegebenen Codeauschnitt (fast) 1:1



  • Habe es nun gelöst. .. Für die die's interessiert:
    Ich habe mich nun doch für die einfachere Methode die mir auch Michamab vorgeschlagen hat entschieden, buf.putInt() && buf.readInt() usw. steht dem Konstrukt mit den DataStreams letztendlich in nichts nach 🤡
    Mfg und Danke für den Denkanstoß :p


Anmelden zum Antworten