首页 > 解决方案 > 如何从节点 js 服务器向客户端发送 json 数据?

问题描述

我有一个设备,它说以下几点它的 api 文档:

1. Use websocket protocol to communication,the websocket version is RFC6455 13,The default listen port is 7788,no TLS encrypt.
2. The data format use Json.you can use javascript to Serializer and Deserialize very easy. 
3. All the key value of json use lower-char.the name or all chinese char use UTF8 encoded.

我正在创建 nodejs 应用程序作为该设备的服务器。

var net = require("net");

var server = net.createServer();

server.on("connection",function(socket){
    socket.on("data",function(d){
       console.log("Data from  %s : %s", remoteAddress,d);
     socket.write(
        {
        "cmd":"getuserlist",
        "stn":true
        }
    );
    });
});
server.listen(9000,function(){
    console.log("Server listening to port %j", server.address());
});

正在连接设备。连接后,我将 json 数据发送到设备,根据文档,它还需要响应 json 数据,但它不起作用。请帮助我得到答复。此外,我需要通过解析 json 响应来调用 url。让我说清楚。

//If i get response like:
success:{
  "count":40,
}
//I need to call an url like:
"http://example.com/40/"

我怎样才能实现它?
PS:我是 node.js 的新手

标签: node.jsjson

解决方案


上面提供的代码有几个问题:

  • remoteAddress从未声明,但在日志语句中使用

  • socket.write仅接受字符串参数,因此您需要在发送 JS 对象之前对其进行字符串化

  • 您已指定需要在连接后将 JSON 数据发送到客户端(设备),但实际上您将其作为对客户端请求的响应发送。

  • 您已指定“默认侦听端口为7788”,但您的服务器正在侦听端口9000
  • 最后,您已指定通信协议websocket-s不是tcp-sockets.

TCP 套接字的示例:

const net = require("net");
const server = net.createServer();

server.on("connection", function(socket) {
    const remoteAddress = socket.remoteAddress;

    socket.write(JSON.stringify({
        cmd: "getuserlist",
        stn: true
    }));

    socket.on("data", function(d) {
        const data = JSON.parse(d);
        console.log("Data from  %s : %j", remoteAddress, data);

        if (data.success && data.success.count == 40) {
          // TODO: Call an url ...
        }
    });
});

server.listen(7788, function() {
    console.log("Server listening to port %j", server.address());
});

您可以使用例如测试 tcp-servertelnet

$ telnet localhost 7788

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
{"cmd":"getuserlist","stn":true}
{"success": {"count": 40}}

Web 套接字示例:

npm i -S ws

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 7788 });

wss.on('connection', function (ws, req) {
    const remoteAddress = req.connection.remoteAddress
    ws.send(JSON.stringify({
        cmd: "getuserlist",
        stn: true,
    }));

    ws.on('message', function (d) {
        const data = JSON.parse(d);
        console.log("Data from  %s : %j", remoteAddress, data);

        if (data.success && data.success.count == 40) {
            // TODO: Call an url ...
        }
    });
});

wscat您可以使用(或也)测试 web-socket 服务器telnet

npm i -g wscat

$ wscat -c ws://localhost:7788

Connected (press CTRL+C to quit)
< {"cmd":"getuserlist","stn":true}
> {"sucess": {"count": 40}}

推荐阅读