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

2022-08-30 04:11:17

我有一个 vb.net 应用程序,它打开一个套接字并监听它。

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

socket.io,我尝试过websockify,但没有一个被证明是有用的。

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

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


答案 1

至于你的问题,目前你将不得不依靠XHR或websockets来解决这个问题。

目前还没有流行的浏览器为javascript实现任何这样的原始套接字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!");         
    });
});

答案 2

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

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

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

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

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

另一种选择是使用Chrome Sockets。

创建连接

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

您也可以尝试使用(尽管这不是直接的 TCP 通信):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中概述编写自己的服务器。