簡體   English   中英

有沒有辦法用JavaScript進行IP連接?

[英]Is there a way to do a tcp connection to an IP with javascript?

讓我講一下我想要完成的事情。

我有一個具有本地IP地址的設備(芯片和引腳終端),它已被編程為接收某些數據並進行處理。

示例:我以十六進制"30 35"發送字符串"05" ,終端讀取並重啟。

我嘗試過使用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

當我的代碼看起來像這樣:

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

exampleSocket.send("05");

如果我將代碼更改為:

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

exampleSocket.send("05");

我只得到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

所以我想我的問題是。 有沒有辦法准確發送我想要的東西? 沒有任何額外的數據?

我已經在Objective-C和C#中完成了這個,我只是不確定javascript是否可以做到這一點?

請問是否有任何不清楚的地方,我會盡力澄清。

您無法在瀏覽器中通過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 ...                |
+---------------------------------------------------------------+

因此,除非您的端點使用HTTP或webSocket協議,否則無法通過瀏覽器Javascript直接連接到它。

您在問題中看到的內容,因為初始HTTP請求是webSocket連接的開始。 這就是它的工作原理。

如果您在非瀏覽器環境(如node.js)中使用Javascript,則可以使用“net”模塊創建一個普通的TCP套接字,然后您可以使用所需的任何協議。

我終於找到了解決方案。

我要做的是創建一個Windows應用程序,它將充當websocket服務器。

安裝程序時,它將創建一個URI Scheme,以便能夠從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();

            }



}

然后在瀏覽器中它將調用啟動程序的url。 將創建websocket並將其發送到正在運行的localhost:port服務器程序。

Windows程序將盡一切努力獲取數據,然后將其作為原始tcp / ip字節發送到終端。 一旦終端將數據發送回windows程序,windows程序就會將其轉發回websocket以供瀏覽器處理信息。

然后Windows程序將終止所有連接並退出。

你試過這樣使用:

var exampleSocket = new WebSocket('wss://IP:PORT', ['soap', 'xmpp']);

// When the connection is open, send some data to the server
exampleSocket.onopen = function () {
  exampleSocket.send('05'); 
};

// Log errors
exampleSocket.onerror = function (error) {
  console.log('WebSocket Error ' + error);
};

// Log messages from the server
exampleSocket.onmessage = function (e) {
  console.log('Server: ' + e.data);
};

希望我能提供幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM