2012-09-13 7 views
58

Ho un'applicazione vb.net che apre un socket e lo ascolta.Connessione al socket TCP dal browser utilizzando javascript

Ho bisogno di comunicare tramite questo socket a tale applicazione utilizzando un javascript in esecuzione su un browser. Ho bisogno di inviare alcuni dati su questo socket in modo che l'app che sta ascoltando su questo socket possa prendere quei dati, fare alcune cose usando alcune chiamate remote e ottenere più dati e rimetterli sul socket che il mio javascript deve leggere e stampare nel browser.

Ive ha provato, socket.io, websockify ma nessuno si è rivelato utile.

Quindi la domanda, è quello che sto provando anche possibile? C'è un modo in cui un javascript in esecuzione in un browser può connettersi a un socket TCP e inviare alcuni dati e ascoltarlo per un po 'più di risposta dei dati sul socket e stamparlo sul browser.

Se questo è possibile, qualcuno può indicarmi la direzione giusta per decidere quale sarebbe l'obiettivo.

+1

No, si sono limitati a WebSockets – Bergi

+1

@Bergi - HTTP è un protocollo su TCP, quindi perché può una connessione HTTP essere fatta, ma non TCP? –

+0

@kilaka: poiché le API (standard) disponibili in un ambiente browser [sono limitate a quelle] (http://stackoverflow.com/q/10902256/1048572). – Bergi

risposta

19

È possibile utilizzare 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/

Il server deve essere in ascolto con un server WebSocket come pywebsocket, in alternativa, è possibile scrivere il proprio, come indicato al Mozilla

Additional:

Aggiornamento: Dal W3C Progetto gennaio 2016:

Ciò sarà possibile attraverso l'interfaccia di navigazione come illustrato di seguito:

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); 
    ); 
+22

Per elaborare un po 'di più su questa risposta: il server deve anche essere in ascolto con un server WebSocket. WebSockets non può connettersi direttamente a un socket TCP non elaborato. websockify è uno strumento che funge da proxy WebSocket-to-TCP: si trova sul server e ascolta le connessioni WebSocket, quindi inoltra le comunicazioni WebSocket ae da un socket TCP specificato. – apsillers

+24

Questo ** non risponde alla domanda ** - websocket è un protocollo su TCP (come HTTP ad esempio) e non una comunicazione TCP diretta. –

+0

ma come inserire il messaggio nella finestra del browser? :( – shzyincu

0

La soluzione che cercate per sono prese del web. Tuttavia, il progetto chromium ha sviluppato alcune nuove tecnologie che sono connessioni TCP dirette TCP chromium

31

Per quanto riguarda il problema, attualmente si dovrà dipendere da XHR o websocket per questo.

Attualmente nessun browser popolare ha implementato alcun tipo di API raw socket per javascript che consente di creare e accedere a socket non elaborati, ma una bozza per l'implementazione di API raw socket in JavaScript è in corso. Date un'occhiata a questi link:
http://www.w3.org/TR/raw-sockets/
https://developer.mozilla.org/en-US/docs/Web/API/TCPSocket

Chrome ora ha il supporto per il protocollo TCP e UDP socket raw nelle sue API ‘sperimentale’. Queste funzionalità sono disponibili solo per le estensioni e, sebbene documentate, sono nascoste per il momento. Detto questo, alcuni sviluppatori stanno già creando progetti interessanti che lo utilizzano, come ad esempio this IRC client.

Per accedere a questa API, è necessario abilitare il flag sperimentale nel manifest dell'estensione.Uso delle prese è piuttosto semplice, per esempio:

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!");   
    }); 
}); 
+0

Quali browser supportano socket non elaborati? –

+0

w3 socket raw impl: https://github.com/whiteout-io/tcp-socket – Rondo

+1

Qualsiasi incremento delle prestazioni rispetto a Websockets e Rawsockets? –

3

Vedi jsocket. Non l'ho usato da solo. Sono passati più di 3 anni dall'ultimo aggiornamento (dal 26/6/2014).

* Utilizza Flash :(

Dal 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> 
0

ws2s progetto mira a portare la presa di JS lato browser Si tratta di un server websocket che trasformano websocket alla presa

..

ws2s diagramma schematico

enter image description here

codice di esempio:

var socket = new WS2S("wss://feling.io/ws2s-server/").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) 
}