TCP Problem VB zu Java

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Chris213.

    TCP Problem VB zu Java

    Hi,

    Ich versuche eine TCP Verbindung zwischen Client (in VB) und einem Server (Java) aufzubauen. Das verbinden sowie eine Nachricht senden (Client an den Server) klappt ohne Probleme.

    Wenn ich aber nun die Nachricht im Server auswerten will, gibt es da Probleme, da er mir an die übertragene Zeichenfolge /r/n dran hängt. Wie kann ich das verhindern?

    PS: Ich benutze diese Anleitung
    Es wäre sehr hilfreich wenn du erzählen würdest in wiefern sich die Probleme äußern. Schmiert der Server ab? Was für Exceptions werden geworfen usw. ansonsten kann man dir nicht wirklich helfen mit vermutungen ins blaue hinein.
    Die \n\r kommen aufjedenfall durch Windows, weil dies einen Zeilenumbruch unter Windows darstellt. Dies kannst du verhindern indem du beim Senden in VB eben kein vbNewLine o.ä. sendet, sondern nur das LineFeed (\n oder CHR(10))

    @Alive: er will im Server prüfen, nicht im Client.
    Wenn du das nicht möchtest, müsstest du ggf. schauen, wie du die Daten sendest.
    Verwendest du zB einen Streamwriter und sendest mit .WriteLine dann wird am Ende immer ein NewLine drangehängt (also Char 10 + 13)
    Ändern könntest du das durch die Property Newline=deinChar
    Das ist meine Signatur und sie wird wunderbar sein!
    Das bekämpft aber noch nicht das eigentliche Problem. Denn dass dein Server nicht ordentlich funktioniert. Vlt. kannst du nun Nachrichten schicken, wenn du jedoch eine Textbox (Multiline) in den Stream schickst, wirst du vor selbigen Problem stehen. Deswegen wäre es perse sinnvoller den Server zu fixen, dass er auch ein \n\r verarbeiten kann.
    Wie sendest du die Nachrichten?
    Wichtig ist, dass Java im Gegensatz zu vielen anderen Sprachen BigEndian ist.
    Daher musst du ein entsprechendes Encoding verwenden (BigEndianUnicode z.B.).
    So ich habe nun einen "eigenen Server" geschrieben, der mir mehrere Clients verwaltet. Wenn ein Client einen Befehl schickt, wird dieser vom Server richtig ausgewertet und ein Ergebnis zurückgeschickt, aber der Client empfängt nichts. An was könnte das liegen?

    Senden einer Nachricht an den Client;

    Quellcode

    1. private void senden(java.net.Socket socket, String nachricht) throws IOException {
    2. PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
    3. printWriter.print(nachricht);
    4. System.out.println(nachricht);
    5. printWriter.flush();
    6. }



    Empfangen der Nachricht vom Server:

    VB.NET-Quellcode

    1. Private Sub Listen()
    2. While client.Connected
    3. Try
    4. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
    5. Catch
    6. MessageBox.Show("Verbindung zum Server nicht möglich!")
    7. Application.Exit()
    8. End Try
    9. End While
    10. End Sub



    Wegen dem BigEndian: Da müsste der Client ja trotzdem etwas empfangen, aber eben nur ein Müll, wenn man das nicht umwandelt, oder habe ich das falsch verstanden?
    Richtig.

    Selbiges gilt für den Server. Du musst vor dem Senden und vor dem Verarbeiten der empfangenen Daten ggf. (mit BitConverter.IsLittleEndian überprüfen) umwandeln.
    Für Strings gibt's Encoding.BigEndianUnicode, für alles Andere tut's ein einfaches Array.Reverse().
    Kommt drauf an, was du schickst und wie du es emfängst.
    Bei Strings tut's das richtige Encoding, bei allem anderen Array.Reverse.
    Anscheinend verwendet der StreamWriter schon das richtige Encoding mit der richtigen Endianness.
    Die wird bei Unicode glaube ich irgendwo angegeben, mit einer Byte-Order-Mask oder so.
    Probier's aber mal mit Zahlen (nicht String-Zahlen, richtige Binär-Zahlen.) Da wirst du glaube ich Probleme bekommen.
    Zahlen (123456789) werden ebenfalls richtig übertragen.

    Hab nun ein weiteres Problem, wie mach ich das ganze mit mehreren Fenstern? Wenn ich das 1. Fenster schließe und das nächste öffne, bleibt das geöffnete hängen und das zu schließende schließt nicht.
    Wenn ich alles mit TCP auskommentiere funktioniert es.