有没有办法用javascript与IP进行tcp连接?
让我介绍一下我正在努力实现的目标 我有一个设备(芯片和pin终端),它有一个本地IP地址,它已经被编程来接收某些数据并进行处理 示例:我以十六进制发送字符串有没有办法用javascript与IP进行tcp连接?,javascript,websocket,sockjs,Javascript,Websocket,Sockjs,让我介绍一下我正在努力实现的目标 我有一个设备(芯片和pin终端),它有一个本地IP地址,它已经被编程来接收某些数据并进行处理 示例:我以十六进制发送字符串“05”“30 35”,终端读取该字符串并将重新启动 我已经尝试使用以及内置 但是,使用WebSocket时,我注意到浏览器正在发送: GET / HTTP/1.1 Host: IP:PORT Connection: Upgrade Pragma: no-cache Cache-Control: no-cache Upgrade: webso
“05”
“30 35”,终端读取该字符串并将重新启动
我已经尝试使用以及内置
但是,使用WebSocket时,我注意到浏览器正在发送:
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', ['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);
};
如果我将代码更改为:
var exampleSocket = new WebSocket("wss://IP:PORT");
exampleSocket.send("05");
我只收到3个发送的标记:SYN(0x0016)ETX(0x0003)SOH(0x0001)
现在我不确定是否需要WebSocket服务器才能解释传入的数据
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是否可以做到这一点
请询问是否有不清楚的地方,我会尽力澄清。您是否尝试过这样使用:
var exampleSocket = new WebSocket("ws://IP:PORT");
exampleSocket.send("05");
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);
};
希望我能帮上忙 您不能在浏览器中通过Javascript建立普通TCP连接,从而允许您以自己的数据格式或协议发送数据。浏览器根本不支持这一点 它只允许您进行Ajax请求和WebSocket连接。Ajax和WebSocket请求都以HTTP请求的形式开始使用。对于webSocket请求,在双方同意后,HTTP请求可以“升级”到webSocket协议,但发送到服务器的初始数据将是合法的HTTP请求。您可以看到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方案,以便能够从
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程序将关闭所有连接并退出。当我将代码更改为该代码时,我看到它正在发送相同的标记,SYN ETX soh这是一个ASCII响应!!同步->同步空闲,ETX->文本结束和SOH->标题开始。。这对我来说没什么意义。。。这个芯片应该如何处理您发送给它的“05”?芯片响应的协议是什么?终端将读取十六进制的“05”,即“3035”。机器将知道该命令并自行重启。我无法重新编程终端如何与其接收的数据交互。我只知道我不需要为文本的开头或结尾发送任何额外的十六进制字符。是否有剥离它的方法,这样我就可以发送“原始”数据,而不需要额外的标记?首先,你确定“05”是十六进制的“3035”吗?仅接收“05”的终端iis不需要与诸如exampleSocket.send(JSON.stringfy({id:“05”}))之类的密钥名相关联;是的,我知道这是正确的十六进制值,因为websocket添加了一堆额外的信息,当我使用工作正常的c#程序运行它时,我在WireShark上看到发送2个字节,这是05,但是当我捕获发送数据的websocket时,我看到它发送156个字节的数据,当我只告诉它发送“05”时,为什么通过JS连接本地网络设备很重要?难道不可能在服务器上这样做并通过AJAX事件执行事务吗?选择另一种语言,几乎任何其他语言,其相对简单,但(浏览器)JavaScript根本不是设计来实现的。否则,进行反射式攻击将是儿童游戏。非常好的解释。简言之,在浏览器中,不可能建立纯TCP连接,因为该协议是更高的应用层HTTP。为什么选择向下投票?其中哪一部分不正确或需要改进?