使用 javascript 从浏览器连接到 TCP Socket

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

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

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

所以问题就来了,我想做的事有可能吗?浏览器中运行的 javascript 是否可以连接到 tcp 套接字并发送一些数据,监听套接字上的更多数据响应并将其打印到浏览器中。

如果可能的话,有没有人能给我指明正确的方向,帮助我确立目标。

292874 次浏览

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

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中的概述编写自己的服务器

您真正需要的解决方案是 Web 套接字。然而,铬项目已经开发了一些新技术,直接 TCP 连接 TCP 铬

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

Jocket。自从上次更新(截至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>

Ws2s 项目旨在将 socket 引入到浏览器端的 js 中,它是一个将 websocket 转换为 socket 的 websocket 服务器。

Ws2s 原理图

enter image description here

代码示例:

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

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

  1. 桥应用程序,位于客户机上,可以处理 TCP/IP 套接字和 WebSocket。它将与所涉及的 TCP/IP 套接字进行交互。

  2. 服务器端应用程序(例如 JSP/Servlet WAR) ,它可以对 WebSocket 进行通信。它包括至少一个 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 套接字服务器(桥接器对话的服务器)与服务器应用程序位于同一台机器上,则可能将这些组件合并为一个。