web-dev-qa-db-fra.com

Connexion à TCP Socket à partir du navigateur en utilisant javascript

J'ai une application vb.net qui ouvre un socket et écoute dessus.

J'ai besoin de communiquer via cette socket avec cette application en utilisant un javascript exécuté sur un navigateur. C’est-à-dire que j’ai besoin d’envoyer des données sur ce socket pour que l’application qui écoute sur ce socket puisse prendre ces données, utiliser des appels distants et obtenir des données supplémentaires et les replacer sur le socket que mon javascript doit utiliser. lisez-le et imprimez-le dans le navigateur.

J'ai essayé, socket.io, websockify, mais aucun ne s'est avéré utile.

D'où la question, est ce que j'essaye même possible? Existe-t-il un moyen pour un javascript exécuté dans un navigateur de se connecter à un socket TCP, d’envoyer des données et d’écouter une réponse supplémentaire sur le socket, puis de l’imprimer sur le navigateur.

Si cela est possible, quelqu'un peut-il m'indiquer la meilleure solution pour m'aider à établir l'objectif?.

95
swordfish

Pour ce qui est de votre problème, vous devrez actuellement vous fier à XHR ou à des websockets pour cela.

À l'heure actuelle, aucun navigateur populaire n'a implémenté une telle api de sockets brute pour javascript qui vous permet de créer et d'accéder à des sockets bruts, mais un brouillon pour la mise en œuvre de cette api en JavaScript est en cours. Jetez un coup d'œil à ces liens:
http://www.w3.org/TR/raw-sockets/
https://developer.mozilla.org/en-US/docs/Web/API/TCPSocket

Chrome prend désormais en charge les sockets raw TCP et UDP dans ses API "expérimentales". Ces fonctionnalités ne sont disponibles que pour les extensions et, bien que documentées, sont masquées pour le moment. Cela dit, certains développeurs créent déjà des projets intéressants utilisant ce logiciel, tels que this IRC client .

Pour accéder à cette API, vous devez activer l'indicateur expérimental dans le manifeste de votre extension. Utiliser des sockets est assez simple, par exemple:

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

Vous pouvez utiliser 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/en/tutorials/websockets/basics/

Votre serveur doit également écouter avec un serveur WebSocket tel que pywebsocket. Vous pouvez également écrire le vôtre, comme indiqué à l’adresse Mozilla

Supplémentaire:

Mise à jour: Version préliminaire du W3C de janvier 2016:

Cela sera possible via l'interface du navigateur comme indiqué ci-dessous:

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 le projet vise à amener un socket vers le navigateur js. C'est un serveur websocket qui transforme websocket en socket.

schéma schématique ws2s

enter image description here

exemple de code:

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

Voir jsocket . Je ne l'ai pas utilisé moi-même. Été plus de 3 ans depuis la dernière mise à jour (au 26/6/2014).

* Utilise flash :(

De la documentation :

<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
AlikElzin-kilaka

Pour obtenir ce que vous voulez, vous devez écrire deux applications (par exemple, Java ou Python):

  1. Application Bridge installée sur la machine du client et pouvant gérer à la fois les sockets TCP/IP et WebSockets. Il va interagir avec le socket TCP/IP en question.

  2. Application côté serveur (telle qu'un fichier WAR JSP/Servlet) pouvant parler à WebSockets. Il comprend au moins une page HTML (y compris le code de traitement côté serveur si nécessaire) accessible à un navigateur.

Ça devrait marcher comme ça

  1. Le pont ouvre une connexion WS à l'application Web (car un serveur ne peut pas se connecter à un client).
  2. L'application Web demandera au client de s'identifier
  3. Le client du pont envoie des informations d’ID au serveur, qui les stocke pour identifier le pont.
    1. La page consultable par le navigateur se connecte au serveur WS à l'aide de JS.
    2. Répétez l'étape 3, mais pour la page basée sur JS
    3. La page basée sur JS envoie une commande au serveur, y compris à quel pont elle doit aller.
    4. Le serveur transmet la commande au pont.
    5. Le pont ouvre une socket TCP/IP et interagit avec elle (envoie un message, obtient une réponse).
    6. Le pont envoie une réponse au serveur via WS
    7. Le WS transmet la réponse à la page consultable par le navigateur
    8. Le SC traite la réponse et réagit en conséquence
    9. Répéter jusqu'à ce que le client se déconnecte/décharge

Note 1: Les étapes ci-dessus constituent une vaste simplification et n'incluent pas d'informations sur le traitement des erreurs et les demandes keepAlive, dans le cas où le client se déconnecte prématurément ou que le serveur doit informer les clients qu'il est en train de fermer/redémarrer.

Note 2: En fonction de vos besoins, il peut être possible de fusionner ces composants en un seul si le serveur de socket TCP/IP en question (auquel le pont parle) est sur le même ordinateur que l'application serveur. .

0
Agi Hammerthief

La solution que vous recherchez réellement est des sockets Web. Cependant, le projet chrome a mis au point de nouvelles technologies qui sont des connexions directes TCP chrome TCP

0
Sdedelbrock