让我讲一下我想要完成的事情.
我有一个具有本地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
当我的代码看起来像这样:
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套接字,然后您可以使用所需的任何协议.