Json 输出奇怪的字符

问题描述

我在 nodejs 中实现了套接字,它以 json 格式从设备获取数据。但是当我打印这些数据时,它显示了奇怪的字符。我测试了在数据包发送器中发送 json 并且在我解析这个 json 时它可以工作。但它不适用于以 UTF8 编码的 json 格式发送数据的 R51-GPRS 设备。

Pic : Output of data

文本 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

Pic 2 : Output of data

文本 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� 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�

Text3: ��_��RDz�1���h廯5���!���p���▒▒��j���b���1���������'���'���p���~弹7���p���~弹7������c ��!���%���`��!���=���j���'���

甚至还有汉字(可能是中文

我的代码

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');
});

就像我说的,它从 R51-GPRS 设备获取 JSON(文档说它以 utf8 编码的 json 格式发送)。我用另一个 json 测试了我的代码,它可以工作,但我不知道这个设备实际发送到套接字的内容。文档中有 PHP 代码我模仿了它,但我卡在这里,因为我无法读取这些数据。它必须是 JSON。

解决方法

我在 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 = ""
      }
    }
  }
})