问题描述
我在 nodejs 中实现了套接字,它以 json 格式从设备获取数据。但是当我打印这些数据时,它显示了奇怪的字符。我测试了在数据包发送器中发送 json 并且在我解析这个 json 时它可以工作。但它不适用于以 UTF8 编码的 json 格式发送数据的 R51-GPRS 设备。
文本 1:��_�9�d�Z�{��m�^�3�J�=�▒▒G�p�/��-��3�Z�j�W�% �]�)�[����-�▒▒=�\�v�_�=�B�r�]�s�X�z��k�J�/� �j�\�l�C�=� �/��y�J�e�▒▒,� �3�Z�m�J�e�▒▒,� �3�I�{�P�z��/��=�V�l� C�=� �.� �3�L�z�L�z�▒▒.��j�\�y�▒▒.��j�\�|�K�=�=�J�{�N�=� �=�J�{�V�=��3�L�z�W�h�V�=��3�_�~�^�=�▒▒w�P�,��3�_� m�N�m�▒▒=�q�/��&��,��k�T�=�▒▒/�/��&�%��,�▒▒=�X�=�▒ ▒/� �2��/��&��=�D
文本 2:�}LV�#
LJ�e,C�|TI�iX�(X�gHJ�tWJ�hJC�tB@�|@K�gVX�$X�gJJ�uKW�|WJ�h?C�}8X�8�_ �Te�v�v(G�1uG�va
�n0?�[T�fW�d"G�vq�'|G�vv�lpU�d$R�a#V�20I�0w�:t
�niG�;v�:�v(G�2aV�v>G�'w�=h�n!U�d>G�$a
�10_�d"U�vq�0a
�10_�d"U�vb�'{�v(V�d"I�8}�=h�n V� Text3: ��_��RDz�1���h廯5���!���p���▒▒��j���b���1���������'���'���p���~弹7���p���~弹7������c ��!���%���`��!���=���j���'���
甚至还有汉字(可能是中文) 我的代码: 就像我说的,它从 R51-GPRS 设备获取 JSON(文档说它以 utf8 编码的 json 格式发送)。我用另一个 json 测试了我的代码,它可以工作,但我不知道这个设备实际发送到套接字的内容。文档中有 PHP 代码我模仿了它,但我卡在这里,因为我无法读取这些数据。它必须是 JSON。 Q�vg�0g�&0_�g>G�'w�$0_�g>G�'w�5
�n#I�!a�$e�n I�!a �8}�n]�vg�0|�8}�nS�vt�8u
�n0�6{
�z"G�vt
�9e�10_�ZS�d23�z+K�v>G��n0W�f#H�a?U�t#】�f+_�c0I�9s�n0U�y"T�+H�g ? �y'�)o��_��"��A������E���Q������k���������A�� �L���F���@�������ύ�菏G���D���Y���F���C������Q������G ���X��������Q���������A���Q���������R���K�������臧M ���X����������W���W���������G����������G����P����螞Q��� U��������Q���M������W���L���M������D���E������K������D ���U��������������▒▒������O����������������▒▒��������C����� ��Ъ▒▒����������_��_Y�"4�~=4�1+s�1u4�}{,�IX�"i$�!k&�1u4�c,e�1c4� uo.�#l&�$l#� kp�?{r�e0x�|{,�14y�v5x�~<r�var net = require('net');
const { match } = require('assert');
var sockets = [];
net.createServer(function (socket) {
console.log('socket connected');
var buffer = '';
socket.on('data',function(data) {
if( !sockets.includes(socket)){
var line = data.toString();
console.log('got "data"',line);
var rePattern = new RegExp(/Sec-WebSocket-Key:\s*(.*?)\r\n/);
var key = line.match(rePattern);
console.log("Key1" + key[1]);
const buffer = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: "+ key[1] +"\r\n\r\n";
socket.write(buffer);
sockets.push(socket);
}else{
if (data) {
console.log(data);
var JSONdat = JSON.parse(data);
console.log(JSONdat);
}
}
});
socket.on('end',function() {
console.log('end');
});
socket.on('close',function() {
console.log('close');
});
socket.on('error',function(e) {
console.log('error ',e);
});
}).listen(7788,function() {
console.log('TCP Server is listening on port 7788');
});
解决方法
我在 Nodejs 中找不到解决方案。我试图将一些 php 代码转换为 nodejs,但没有奏效。经过多次尝试使用 Ratchet 并成功。
,当您使用 socket.on('data') 时,您正在接收一个缓冲区。需要等待数据完整后再使用。
例如
let received = ""
client.on("data",data => {
received += data
const messages = received.split("\n")
if (messages.length > 1) {
for (let message of messages) {
if (message !== "") {
console.log(JSON.parse(message))
received = ""
}
}
}
})