webentwicklung-frage-antwort-db.com.de

Herstellen einer Verbindung zum TCP Socket vom Browser aus mit Javascript

Ich habe eine vb.net-Anwendung, die einen Socket öffnet und darauf lauscht.

Ich muss über diesen Socket mit einem in einem Browser ausgeführten Javascript mit dieser Anwendung kommunizieren. Das heißt, ich muss einige Daten über diesen Socket senden, damit die App, die diesen Socket abhört, diese Daten entgegennimmt, einige Dinge mit Hilfe von Remoteaufrufen ausführt und einige weitere Daten abruft und sie wieder auf den Socket legt, den mein Javascript benötigt Lesen und drucken Sie es im Browser.

Ich habe versucht, socket.io, websockify, aber keine haben sich als nützlich erwiesen.

Daher die Frage, was versuche ich überhaupt möglich? Gibt es eine Möglichkeit, dass ein in einem Browser ausgeführtes Javascript eine Verbindung zu einem TCP-Socket herstellen und einige Daten senden kann, um weitere Datenantworten auf dem Socket zu erhalten und sie an den Browser auszudrucken?.

Wenn dies möglich ist, kann mich jemand in die richtige Richtung weisen, die mir helfen würde, das Ziel zu erreichen.

95
swordfish

Derzeit müssen Sie für Ihr Problem auf XHR oder Websockets angewiesen sein.

Derzeit hat kein beliebter Browser eine solche RAW-Sockets-API für JavaScript implementiert, mit der Sie RAW-Sockets erstellen und darauf zugreifen können. Derzeit wird jedoch ein Entwurf für die Implementierung der RAW-Sockets-API in JavaScript erstellt. Schauen Sie sich diese Links an:
http://www.w3.org/TR/raw-sockets/
https://developer.mozilla.org/en-US/docs/Web/API/TCPSocket

Chrome unterstützt jetzt Raw TCP und UDP-Sockets in seinen "experimentellen" APIs. Diese Funktionen sind nur für Erweiterungen verfügbar und sind, obwohl dokumentiert, für den Moment versteckt. Allerdings erstellen einige Entwickler bereits interessante Projekte damit, wie this IRC client .

Um auf diese API zugreifen zu können, müssen Sie das experimentelle Flag im Manifest Ihrer Erweiterung aktivieren. Die Verwendung von Sockets ist ziemlich einfach, zum Beispiel:

chrome.experimental.socket.create('tcp', '127.0.0.1', 8080, function(socketInfo) {
  chrome.experimental.socket.connect(socketInfo.socketId, function (result) {
        chrome.experimental.socket.write(socketInfo.socketId, "Hello, world!");         
    });
});
48
Robin Rizvi

Sie können HTML5 Web Sockets:

var connection = new WebSocket('ws://IPAddress:Port');

connection.onopen = function () {
  connection.send('Ping'); // Send the message 'Ping' to the server
};

http://www.html5rocks.com/de/tutorials/websockets/basics/

Ihr Server muss auch mit einem WebSocket-Server wie pywebsocket verbunden sein. Alternativ können Sie Ihren eigenen wie unter Mozilla beschrieben schreiben

Zusätzlich:

Update: Aus dem W3C Draft Januar 2016:

Dies wird über die Navigator-Oberfläche wie folgt möglich sein:

http://raw-sockets.sysapps.org/#interface-tcpsocket

https://www.w3.org/TR/tcp-udp-sockets/

navigator.tcpPermission.requestPermission({remoteAddress:"127.0.0.1", remotePort:6789}).then(
  () => {
    // Permission was granted
    // Create a new TCP client socket and connect to remote Host
    var mySocket = new TCPSocket("127.0.0.1", 6789);

    // Send data to server
    mySocket.writeable.write("Hello World").then(
        () => {

            // Data sent sucessfully, wait for response
            console.log("Data has been sent to server");
            mySocket.readable.getReader().read().then(
                ({ value, done }) => {
                    if (!done) {
                        // Response received, log it:
                        console.log("Data received from server:" + value);
                    }

                    // Close the TCP connection
                    mySocket.close();
                }
            );
        },
        e => console.error("Sending error: ", e)
    );
  }
);
28
Darren

ws2s Das Projekt zielt darauf ab, Socket auf browserseitige js zu bringen. Es ist ein Websocket-Server, der Websocket in Socket umwandelt.

ws2s schematisches Diagramm

enter image description here

codebeispiel:

var socket = new WS2S("wss://ws2s.feling.io/").newSocket()

socket.onReady = () => {
  socket.connect("feling.io", 80)
  socket.send("GET / HTTP/1.1\r\nHost: feling.io\r\nConnection: close\r\n\r\n")
}

socket.onRecv = (data) => {
  console.log('onRecv', data)
}
4
chenyan

Siehe jsocket . Habe es selbst nicht benutzt. Seit der letzten Aktualisierung vor mehr als 3 Jahren (Stand: 26.06.2014).

* Verwendet Flash :(

Aus der Dokumentation :

<script type='text/javascript'>
    // Host we are connecting to
    var Host = 'localhost'; 
    // Port we are connecting on
    var port = 3000;

    var socket = new jSocket();

    // When the socket is added the to document 
    socket.onReady = function(){
            socket.connect(Host, port);             
    }

    // Connection attempt finished
    socket.onConnect = function(success, msg){
            if(success){
                    // Send something to the socket
                    socket.write('Hello world');            
            }else{
                    alert('Connection to the server could not be estabilished: ' + msg);            
            }       
    }
    socket.onData = function(data){
            alert('Received from socket: '+data);   
    }

    // Setup our socket in the div with the id="socket"
    socket.setup('mySocket');       
</script>
4

Um das zu erreichen, was Sie wollen, müssen Sie zwei Anwendungen schreiben (entweder in Java oder Python, zum Beispiel):

  1. Bridge-App, die auf dem Clientcomputer installiert ist und sowohl TCP/IP-Sockets als auch WebSockets verarbeiten kann. Es wird mit dem betreffenden TCP/IP-Socket interagieren.

  2. Serverseitige App (z. B. eine JSP/Servlet-WAR), die mit WebSockets kommunizieren kann. Es enthält mindestens eine HTML-Seite (einschließlich des serverseitigen Verarbeitungscodes, falls erforderlich), auf die ein Browser zugreifen kann.

Es sollte so funktionieren

  1. Die Bridge öffnet eine WS-Verbindung zur Web-App (da ein Server keine Verbindung zu einem Client herstellen kann).
  2. Die Web-App fordert den Client auf, sich zu identifizieren
  3. Der Bridge-Client sendet einige ID-Informationen an den Server, in dem sie gespeichert werden, um die Bridge zu identifizieren.
    1. Die vom Browser angezeigte Seite stellt über JS eine Verbindung zum WS-Server her.
    2. Wiederholen Sie Schritt 3, aber für die JS-basierte Seite
    3. Die JS-basierte Seite sendet einen Befehl an den Server, einschließlich der Brücke, zu der er gehen muss.
    4. Der Server leitet den Befehl an die Bridge weiter.
    5. Die Bridge öffnet einen TCP/IP-Socket und interagiert damit (sendet eine Nachricht, erhält eine Antwort).
    6. Die Bridge sendet über den WS eine Antwort an den Server
    7. Der WS leitet die Antwort an die vom Browser angezeigte Seite weiter
    8. Das JS verarbeitet die Antwort und reagiert entsprechend
    9. Wiederholen, bis einer der Clients die Verbindung trennt/entlädt

Anmerkung 1: Die obigen Schritte sind eine große Vereinfachung und enthalten keine Informationen zur Fehlerbehandlung und zu KeepAlive-Anforderungen, falls der Client die Verbindung vorzeitig trennt oder der Server die Clients darüber informieren muss, dass er heruntergefahren wird/neu starten.

Hinweis 2: Je nach Ihren Anforderungen können diese Komponenten möglicherweise zu einer zusammengeführt werden, wenn sich der betreffende TCP/IP-Socket-Server (mit dem die Bridge kommuniziert) auf demselben Computer befindet wie die Server-App .

0
Agi Hammerthief

Die Lösung, nach der Sie wirklich suchen, sind Web-Sockets. Das Chromprojekt hat jedoch einige neue Technologien entwickelt, die direkte TCP Verbindungen TCP Chrom sind

0
Sdedelbrock