提问者:小点点

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


我有一个VB.NET应用程序,它打开一个套接字并侦听它。

我需要通过这个套接字使用在浏览器上运行的javascript与那个应用程序通信。也就是说,我需要在这个套接字上发送一些数据,以便在这个套接字上监听的应用程序能够获取这些数据,使用一些远程调用执行一些操作,并获取更多的数据,然后将其放回我的javascript需要读取的套接字上,并在浏览器中打印这些数据。

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

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

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


共3个答案

匿名用户

至于您的问题,目前您将不得不依赖于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!");         
    });
});

匿名用户

这可以通过navigator界面实现,如下所示:

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

您的服务器还必须与WebSocket服务器(如pywebsocket)一起侦听,或者,您可以编写自己的服务器,如Mozilla所述

匿名用户

ws2s项目旨在将socket引入浏览器端JS。它是一个将websocket转换为socket的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)
}