使用JavaScript从浏览器连接到TCP套接字


111

我有一个vb.net应用程序,可以打开一个套接字并对其进行侦听。

我需要使用浏览器上运行的JavaScript通过此套接字与该应用程序通信。那就是我需要在此套接字上发送一些数据,以便正在此套接字上侦听的应用程序可以获取该数据,使用一些远程调用执行一些操作,并获取更多数据,然后将其放回我的JavaScript需要进行处理的套接字上在浏览器中阅读并打印。

香港专业教育学院尝试过,socket.io,websockify,但没有被证明是有用的。

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

如果可能的话,有人可以指出正确的方向,这将有助于我确定目标。


3
不,您只能使用WebSockets
Bergi 2012年

2
@Bergi-HTTP是基于tcp的协议,那么为什么可以建立HTTP连接而不建立TCP?
AlikElzin-kilaka 2014年

@kilaka:因为在浏览器环境可用的(标准)API 仅限于那些
Bergi 2014年


6
我看到了一个爬上Javascript脊梁的新标准:w3.org/TR/raw-sockets
2014年

Answers:


57

至于您的问题,当前您将不得不依靠XHR或websockets。

当前,没有流行的浏览器为javascript实现任何此类原始套接字api,这些API可以让您创建和访问原始套接字,但是有关在JavaScript中实现原始套接字api的草案正在进行中。看看这些链接:http :
//www.w3.org/TR/raw-sockets/
https://developer.mozilla.org/en-US/docs/Web/API/TCPSocket

Chrome现在在其“实验” API中支持原始TCP和UDP套接字。这些功能仅适用于扩展功能,尽管已记录,但目前仍处于隐藏状态。话虽如此,一些开发人员已经在使用它来创建有趣的项目,例如此IRC客户端。

要访问此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!");         
    });
});

哪些浏览器支持原始套接字?
AlikElzin-kilaka 2014年

2
与Websockets和Rawsockets相比,性能提高了吗?
NiCk Newman

3
不允许浏览器中的javascript连接到tcp端口(一个安全漏洞)吗?想象一下您的firefox / chrome中的javascript连接到您在本地运行的任何内容(例如MySQL DB)并将数据发布到恶意站点?
阿伦·阿瓦纳森

@ArunAvanathan无论您使用ajax做什么,都可以使用套接字,反之亦然...我认为没有安全问题。
Firas Abd Alrahman

1
@FirasAbdAlrahman我认为有多种安全策略可以控制HTTP / S的浏览器行为。因此,通过TCP的浏览器套接字连接与HTTP / S不同。
阿伦·阿瓦纳森

30

如下所示,这可以通过导航器界面实现:

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

w3.org tcp-udp-sockets文档中概述了更多详细信息。

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

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

另一种选择是使用Chrome套接字

建立连接

chrome.sockets.tcp.create({}, function(createInfo) {
  chrome.sockets.tcp.connect(createInfo.socketId,
    IP, PORT, onConnectedCallback);
});

传送资料

chrome.sockets.tcp.send(socketId, arrayBuffer, onSentCallback);

接收资料

chrome.sockets.tcp.onReceive.addListener(function(info) {
  if (info.socketId != socketId)
    return;
  // info.data is an arrayBuffer.
});

您也可以尝试使用HTML5 Web Sockets(尽管这不是直接的TCP通信):

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

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

http://www.html5rocks.com/zh-CN/tutorials/websockets/basics/

您的服务器还必须正在使用诸如pywebsocket之类的WebSocket服务器进行侦听,或者您可以按照Mozilla的概述编写自己的服务器


25
要详细说明此答案:服务器还必须使用WebSocket服务器进行侦听。WebSockets无法直接连接到原始TCP套接字。websockify是一种充当WebSocket到TCP代理的工具:它位于您的服务器上,侦听WebSocket连接,然后将WebSocket通信往返于指定的TCP套接字进行转发。
apsillers 2012年

58
不能回答问题 -websocket是基于TCP的协议(例如HTTP),而不是直接进行TCP通信。
AlikElzin-kilaka 2014年

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

3
这个答案是完全错误的,应该删除。
布拉德,

1
@Brad这个答案对我有帮助,它一定对其他有22个投票的人有所帮助。
user1378687'8

6

ws2s项目旨在将套接字引入浏览器端js。这是一个Websocket服务器,可将Websocket转换为套接字。

ws2s示意图

在此处输入图片说明

代码示例:

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

5

jsocket。我自己没有使用过。自上次更新以来(截至2014年6月26日)已超过3年。

*使用闪光灯:(

文档中

<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

您真正要寻找的解决方案是Web套接字。但是,铬项目开发了一些新技术,它们是直接TCP连接TCP铬


0

为了实现所需的功能,您必须编写两个应用程序(例如,使用Java或Python):

  1. 位于客户端计算机上的Bridge应用程序,可以处理TCP / IP套接字和WebSockets。它将与有问题的TCP / IP套接字交互。

  2. 可以使用WebSockets的服务器端应用程序(例如JSP / Servlet WAR)。它包括至少一个HTML页面(如果需要,包括服务器端处理代码),供浏览器访问。

它应该像这样工作

  1. Bridge将打开与Web应用程序的WS连接(因为服务器无法连接到客户端)。
  2. 该Web应用程序将要求客户端标识自己
  3. 网桥客户端将一些ID信息发送到服务器,服务器将其存储以标识网桥。
    1. 浏览器可见的页面使用JS连接到WS服务器。
    2. 重复步骤3,但对于基于JS的页面
    3. 基于JS的页面将命令发送到服务器,包括它必须连接到的网桥。
    4. 服务器将命令转发到网桥。
    5. 桥接器打开一个TCP / IP套接字并与其进行交互(发送消息,获取响应)。
    6. 桥接器通过WS向服务器发送响应
    7. WS将响应转发到浏览器可见的页面
    8. JS处理响应并做出相应的反应
    9. 重复直到任一客户端断开连接/卸载

注意1:如果客户端过早断开连接或服务器需要通知客户端它正在关闭/重新启动,则上述步骤将大大简化,并且不包含有关错误处理和keepAlive请求的信息。

注2:如果有问题的TCP / IP套接字服务器(网桥与之通信)与服务器应用程序位于同一台计算机上,则可以根据您的需要将这些组件合并为一个组件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.