Klaus1: Verständnisproblem: Wie mit Client auf Server mit node.js zugreifen?

Hallo an alle,

für ein kleines Projekt nutze ich auf der Serverseite node.js mit der Library "net".

Mit Putty konnte ich auch schon eine Verbindung aufbauen und Daten austauschen. (Erstmal als ein einfacher Response-Server).

Wenn ich das jetzt aber in meine bestehende HTML-Seite einbauen möchte.... wie mache ich das? Auf der Client-Seite kann ich wohl kaum node.js bzw. die Library net verwenden.

Ich hatte es anfangs mit websocket versucht, aber zum Einen wird an den Server viel Overhead gesendet, z.B. Header-Informationen (User-Agent, Language, etc.), zum Anderen kam der Verbindungaufbau auch nicht zustande (Fehlermeldung des Clients: error: unknown).

Frage: Kann ich überhaupt mit nativem Javaqscript eine Verbindung zum nodes.js-net-Server aufbauen? Wenn ja wie, wenn nein, was brauche ich dafür?

Ziel ist es, dass Browser- und Plattform-unabhängig clientseitig Javascript-Code ausgeführt und darüber eine Verbindung mit der net Library aufzubauen.

Lieben Dank,

Klaus

  1. Hallo Klaus1,

    das net Modul von node.js macht TCP, also native Socket-Kommunikation, wenn ich das richtig verstehe. Aus dem Browser heraus dürfte das nicht ansprechbar sein.

    Dafür würdest Du das hier brauchen, und das ist aus guten Sicherheitsgründen nicht standardisiert worden.

    Entweder nimmst Du den WebSocket-Overhead in Kauf - dieses Protokoll ist für genau diesen Zweck gedacht - oder du guckst Dir mal socket.io an (gerade in der Suchmaschine meines Misstrauens gefunden); da gibt's eine Client-Version. Ich habe aber den Verdacht, dass die Client-Version unter der Haube eine WebSocket Verbindung aufbaut. Aber wenn es Dir um eine plattformneutrale Implementierung geht, könnte socket.io gerade das Richtige sein.

    Im MDN "Archive of obsolete content" wird ein TCPSocket API beschrieben, aber das ist Firefox OS spezifisch. Also tot seit 2017 und nie im Browser angekommen.

    Rolf

    -- sumpsi - posui - clusi
    1. Hallo Rolf,

      vielen Dank für die Antwort. Eventuell bin ich bei GitHub fündig geworden: https://github.com/yankov/webtcp

      Wenn das nicht funktioniert, dann probiere ich es halt doch mit websockets.

      LG Klaus

      1. Hallo Klaus1,

        das ist nur unnötiger Aufwand; es sei denn, du findest das API dieser Lib besonders schick. Wenn Du Websockets selbst aufzubauen verstehst, brauchst Du nicht zwingend eine Library.

        webtcp verwendet laut eigenem Bekunden SockJS, und sockjs-client sagt von sich selbst:

        Under the hood SockJS tries to use native WebSockets first. If that fails it can use a variety of browser-specific transport protocols and presents them through WebSocket-like abstractions.

        "browser-specific transport protocols" sind die Comet-Techniken, die WebSocket Libraries einsetzen wenn sie Websockets simulieren wollen.

        Rolf

        -- sumpsi - posui - clusi
        1. webtcp verwendet laut eigenem Bekunden SockJS, und sockjs-client sagt von sich selbst:

          WebTCP läuft auf dem Server und dient dort als eine Art Proxy: Vom Browser wird eine WebSocket-Verbindung mit dem WebTCP-Server aufgebaut, der baut stellvertrend für ihn eine TCP-Verbindung mit dem eigentlichen Zielserver auf und leitet die Daten von WebSocket-Verbindung an die TCP-Verbindung weiter und umgekehrt. Der TO benötigt immernoch eine WebSocket-Verbindung aber er muss seinen TCP-Service nicht WebSocket-kompatibel machen, dafür hat er nämlich WebTCP.

          1. Hallo,

            Leider funktioniert es nicht so, wie erhofft. Ich habe beide Scripte gestartet und mein Script bekommt dennoch noch den Websocket-Overhead. Dumm auch, dass danach die Verbindung direkt geschlossen wird. Mein Script quittiert dann direkt mit "Verbindung getrennt".

            Ich muss wohl doch die Websockets nutzen. Hier habe ich allerdings das Problem, dass die Verbindung offenbar nicht korrekt aufgebaut wird. Mein Script bekommt zwar den Websocket-Header, aber keinen gesendeten Text und der Client wirft mir beim websocket.onerror nur ein "undefined" vor die Füße. Die Firefox-Konsole zeigt mir: "Firefox kann keine Verbindung zum dem Server unter ws://192.168.1.1:4711/ aufbauen.

            Muss ich auf dem Server also noch einen zweiten Listener für websocket bauen? Dann müsste dieser bei websocket-Daten diese an die Socket-Funktionen schicken und umgekehrt Daten die von der Socket-Verbindung kommen an die Websocket-Funktionen senden? Irgendwie recht umständlich.

            LG Klaus

    2. Hey,

      [...] Ich habe aber den Verdacht, dass die Client-Version unter der Haube eine WebSocket Verbindung aufbaut. [...]

      Genau. Falls man der Verbindung nicht explizit sagt ein/kein WebSocket aufzubauen, versucht socket.io den Server zu erreichen. Wenn das mehrmals erfolgreich war, wird ein Websocket aufgebaut.

      Gruß
      Jo