有没有办法用JavaScript进行IP连接?

Der*_*rek 5 javascript websocket sockjs

让我讲一下我想要完成的事情.

我有一个具有本地IP地址的设备(芯片和引脚终端),它已被编程为接收某些数据并进行处理.

示例:我"05"以十六进制发送字符串,"30 35"终端读取并重启.

我尝试过使用SockJS-Client以及内置的WebSockets.

但是,使用Websockets我注意到浏览器正在发送:

GET / HTTP/1.1
Host: IP:PORT
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: MYIP
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Sec-WebSocket-Key: A1CeTMFnQCZv4GNZbLFnyQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Run Code Online (Sandbox Code Playgroud)

当我的代码看起来像这样:

var exampleSocket = new WebSocket("ws://IP:PORT");

exampleSocket.send("05");
Run Code Online (Sandbox Code Playgroud)

如果我将代码更改为:

var exampleSocket = new WebSocket("wss://IP:PORT");

exampleSocket.send("05");
Run Code Online (Sandbox Code Playgroud)

我只收到3个发送的标签: SYN(0x0016) ETX(0x0003) SOH(0x0001)

现在我不确定你是否需要一个WebSocket Sever才能解释传入的数据.

SockJS通过发送关于自身和broswer的额外信息来做同样的事情:

GET /info?t=1452272641278 HTTP/1.1
Host: IP:PORT
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Origin: MYIP
Accept: */*
Referer: MYIP
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Run Code Online (Sandbox Code Playgroud)

所以我想我的问题是.有没有办法准确发送我想要的东西?没有任何额外的数据?

我已经在Objective-C和C#中完成了这个,我只是不确定javascript是否可以做到这一点?

请问是否有任何不清楚的地方,我会尽力澄清.

jfr*_*d00 6

您无法在浏览器中通过Javascript建立纯TCP连接,从而允许您以自己的数据格式或协议发送数据.浏览器根本不支持.

它只允许您进行Ajax请求和WebSocket连接.Ajax和WebSocket请求都是作为HTTP请求启动的.在webSocket请求的情况下,在双方同意之后,HTTP请求可以"升级"到webSocket协议,但是发送到服务器的初始数据将是合法的HTTP请求.您可以看到此MDN参考,以获取webSocket协议如何从连接到实际数据包格式的整体概述.即使它升级到webSocket协议,它也必须使用webSocket框架格式来处理此处描述的所有数据.

这是webSocket数据框格式的概述:

0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
|     Extended payload length continued, if payload len == 127  |
+ - - - - - - - - - - - - - - - +-------------------------------+
|                               |Masking-key, if MASK set to 1  |
+-------------------------------+-------------------------------+
| Masking-key (continued)       |          Payload Data         |
+-------------------------------- - - - - - - - - - - - - - - - +
:                     Payload Data continued ...                :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|                     Payload Data continued ...                |
+---------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

因此,除非您的端点使用HTTP或webSocket协议,否则无法通过浏览器Javascript直接连接到它.

您在问题中看到的内容,因为初始HTTP请求是webSocket连接的开始.这就是它的工作原理.

如果您在非浏览器环境(如node.js)中使用Javascript,则可以使用"net"模块创建一个普通的TCP套接字,然后您可以使用所需的任何协议.


Der*_*rek 1

我最终找到了解决方案。

我所要做的就是创建一个充当 Websocket 服务器的 Windows 应用程序。

安装程序时,它将创建一个 URI 方案,以便能够从类似的链接调用自身myapp://start

以下是编辑注册表以添加自定义 URI 方案的代码:

static void Main(string[] args) {

            try {

                // SET PATH OF SERVER
                String path = Environment.GetCommandLineArgs()[0];

                // GET KEY
                RegistryKey key = Registry.ClassesRoot.OpenSubKey("myApp");

                // CHECK FOR KEY
                if (key == null) {


                    // SET KEY
                    key = Registry.ClassesRoot.CreateSubKey("myApp");
                    key.SetValue(string.Empty, "URL: myApp Protocol");
                    key.SetValue("URL Protocol", string.Empty);

                    // SET COMMAND
                    key = key.CreateSubKey(@"shell\open\command");
                    key.SetValue(string.Empty, path + " " + "%1");
                    //%1 represents the argument - this tells windows to open this program with an argument / parameter


                }

                // CLOSE
                key.Close();

            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
                Console.ReadKey();

            }



}
Run Code Online (Sandbox Code Playgroud)

然后在浏览器中它将调用启动程序的 url。websocket 将被创建并将其发送到正在运行的 localhost:port 服务器程序。

Windows 程序将尽一切努力获取数据,然后将其作为原始 tcp/ip 字节发送到终端。一旦终端将数据发送回windows程序,windows程序就会将其转发回websocket,以便浏览器处理该信息。

Windows 程序将终止所有连接并退出。