2012-09-13 165 views
58

我有一个打开一个套接字并在其上侦听的vb.net应用程序。使用javascript从浏览器连接到TCP套接字

我需要通过这个插座进行通信使用的浏览器中运行的JavaScript该应用程序。那就是我需要在这个套接字上发送一些数据,以便在这个套接字上监听的应用程序可以接收这些数据,使用一些远程调用做一些事情并获取更多数据,并将其放回到我的javascript需要的套接字上阅读并在浏览器中打印。

我用尽,socket.io,websockify但都没有被证明是有用的。

因此,这个问题,我试图甚至可能吗?有没有一种方法可以让浏览器中运行的JavaScript连接到TCP套接字并发送一些数据,并在套接字上侦听更多的数据响应并将其打印到浏览器。

如果这是可能能有人指出我在正确的方向,以这将帮助我树立的目标。

+1

不,你是有限的WebSockets的 – Bergi

+1

@Bergi - HTTP是通过TCP协议,那么,为什么可以在HTTP连接制成,但不是TCP? –

+0

@ kilaka:因为在浏览器环境中可用的(标准)API [仅限于这些](http://stackoverflow.com/q/10902256/1048572)。 – Bergi

回答

19

您可以使用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/

您的服务器还必须有一个WebSocket的服务器,如pywebsocket,或者你可以写自己的听力作为Mozilla

概述附加:

更新:从W3C草案2016年1月:

这将是通过导航界面可能如下图所示:

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

为了详细阐述这个答案:服务器还必须使用WebSocket服务器进行侦听。 WebSockets无法直接连接到原始TCP套接字。 websockify是一个充当WebSocket-to-TCP代理的工具:它位于您的服务器上并侦听WebSocket连接,然后将WebSocket通信转发到指定的TCP套接字并从指定的TCP套接字转发。 – apsillers

+24

这样做**不回答问题** - websocket是一个基于TCP的协议(例如HTTP)而不是直接的TCP通信。 –

+0

但如何将消息放入浏览器窗口? :( – shzyincu

0

你真正需要的解决方案是网络套接字。然而,铬项目开发了一些新技术,直接TCP连接TCP chromium

31

至于你的问题,目前你将不得不依赖于XHR或websockets。

目前还没有流行的浏览器已经实现了JavaScript的任何这种原始套接字的API,可以让你创建和访问原始套接字,但对原始套接字的API在JavaScript执行情况的草案正在路。看看这些链接:
http://www.w3.org/TR/raw-sockets/
https://developer.mozilla.org/en-US/docs/Web/API/TCPSocket

现在,Chrome拥有原始的TCP,并在其“实验性”的API UDP套接字支持。这些功能仅适用于扩展,虽然有记录,但暂时隐藏。话虽如此,一些开发人员已经在使用它创建有趣的项目,例如this IRC client

要访问此API,你需要确保您的扩展程序清单实验标志。例如,使用套接字非常简单:

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

什么浏览器支持原始套接字? –

+0

w3原始套接字impl:https://github.com/whiteout-io/tcp-socket – Rondo

+1

与Websockets和Rawsockets相比,任何性能都有所提高吗? –

3

请参阅jsocket。没有用过我自己。自上次更新至今已超过3年(截至2014年6月26日)。

*使用闪光灯:(

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项目旨在把插座到浏览器端JS这是转变的WebSocket到插座的WebSocket服务器

ws2s原理图

enter image description here

代码示例:

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) 
}