132

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

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

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

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

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

4

6 回答 6

65

至于您的问题,目前您将不得不依赖 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!");         
    });
});
于 2013-06-27T07:24:53.270 回答
33

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

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

您可以使用也可以尝试使用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的概述编写自己的服务器

于 2012-09-13T13:53:14.803 回答
6

ws2s项目旨在将套接字引入浏览器端 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)
}
于 2018-02-24T11:05:00.090 回答
5

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

* 使用闪光灯 :(

文档中:

<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>
于 2014-06-26T13:21:01.703 回答
0

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

于 2012-11-15T05:59:43.780 回答
0

为了实现您想要的,您必须编写两个应用程序(例如,在 Java 或 Python 中):

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

  2. 可以与 WebSocket 通信的服务器端应用程序(例如 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. Bridge 通过 WS 向服务器发送响应
    7. WS 将响应转发到浏览器可查看的页面
    8. JS 处理响应并做出相应的反应
    9. 重复直到任一客户端断开/卸载

注意 1:上述步骤是一个巨大的简化,不包括有关错误处理和 keepAlive 请求的信息,以防客户端过早断开连接或服务器需要通知客户端它正在关闭/重新启动。

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

于 2019-01-29T14:06:06.290 回答