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

wn9m85ua  于 2023-01-29  发布在  Java
关注(0)|答案(6)|浏览(207)

我有一个vb.net应用程序,它打开一个套接字并侦听它。
我需要通过这个套接字与运行在浏览器上的javascript应用程序通信,也就是说,我需要在这个套接字上发送一些数据,这样监听这个套接字的应用程序就可以接收这些数据,使用远程调用做一些事情,获取更多的数据,然后将其放回套接字,我的javascript需要读取这些数据,并在浏览器中打印这些数据。
我试过,socket.io,websockify,但没有一个被证明是有用的。
因此,问题是,我正在尝试的是可能的吗?有没有一种方法可以让运行在浏览器中的javascript连接到tcp套接字,发送一些数据,监听套接字上的更多数据响应,并将其打印到浏览器上。
如果这是可能的话,谁能给我指出正确的方向,以帮助我确立目标。

qgelzfjb

qgelzfjb1#

至于你的问题,目前你将不得不依赖于XHR或websockets。
目前还没有流行的浏览器为javascript实现任何这样的raw sockets API,允许你创建和访问raw sockets,但是一个在JavaScript中实现raw sockets api的草案正在起草中。
http://www.w3.org/TR/raw-sockets/
https://developer.mozilla.org/en-US/docs/Web/API/TCPSocket
Chrome现在在其“实验性”API中支持原始TCP和UDP套接字。这些功能仅适用于Chrome应用,虽然有文档记录,但目前是隐藏的。话虽如此,一些开发者已经在使用它创建有趣的项目,如this IRC client
要访问这个API,你需要在扩展的清单中启用experimental标志。使用套接字非常简单,例如:

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!");         
    });
});
kognpnkq

kognpnkq2#

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

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.orgtcp-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所述

shyt4zoc

shyt4zoc3#

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

gojuced74#

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>
ui7jx7zq

ui7jx7zq5#

为了实现您想要的结果,您必须编写两个应用程序(例如,用Java或Python):
1.位于客户端计算机上的桥应用程序,可以处理TCP/IP套接字和WebSockets。它将与相关的TCP/IP套接字交互。
1.可以与WebSockets通信的服务器端应用程序(如JSP/Servlet WAR)。它至少包含一个可由浏览器访问的HTML页面(如果需要,包含服务器端处理代码)。
应该是这样的

  1. Bridge将打开到Web应用的WS连接(因为服务器无法连接到客户端)。
  2. Web应用程序将要求客户端标识自身
    1.桥客户端向服务器发送一些ID信息,服务器存储该ID信息以便识别桥。
    1.浏览器可查看的页面使用JS连接到WS服务器。
    1.重复步骤3,但对于基于JS的页面
    1.基于JS的页面向服务器发送命令,包括它必须转到哪个桥。
    1.服务器将命令转发给网桥。
    1.网桥打开一个TCP/IP套接字并与之交互(发送消息,获得响应)。
  3. Bridge通过WS向服务器发送响应
  4. WS将响应转发到浏览器可查看的页面
  5. JS处理响应并做出相应的React
    1.重复此步骤,直到任一客户端断开连接/卸载
  • 注1:* 上述步骤是一个巨大的简化,不包括有关错误处理和keepAlive请求的信息,以防客户端过早断开连接或服务器需要通知客户端它正在关闭/重新启动。
  • 注2:* 根据您的需要,如果所讨论的TCP/IP套接字服务器(桥与之对话)与服务器应用程序位于同一台计算机上,则可以将这些组件合并为一个组件。
nkhmeac6

nkhmeac66#

您真正需要的解决方案是Web套接字,但是chromium项目已经开发了一些新技术,它们是直接TCP连接TCP chromium

相关问题