Tengo un dispositivo que dice los siguientes puntos de su documentación 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.

Estoy creando la aplicación nodejs como servidor para este dispositivo.

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

El dispositivo se está conectando. Después de la conexión, estoy enviando datos json al dispositivo y, de acuerdo con la documentación, también debe responder los datos json, pero no funciona. Ayúdame a obtener la respuesta. Además, necesito llamar a una URL analizando la respuesta json. déjame aclarar.

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

Cómo puedo lograrlo ?
PD: soy nuevo en node.js

1
Bishal Chhetri 24 nov. 2019 a las 15:38

1 respuesta

La mejor respuesta

Hay un par de problemas con el código proporcionado anteriormente:

  • remoteAddress nunca se declaró, pero se usó en la declaración de registro

  • socket.write acepta solo argumentos de cadena, por lo que debe especificar el objeto JS antes de enviarlo

  • Ha especificado que necesita enviar datos JSON al cliente (dispositivo) después de la conexión, pero en realidad lo está enviando como respuesta a las solicitudes del cliente.

  • Ha especificado "El puerto de escucha predeterminado es 7788" pero su servidor está escuchando en el puerto 9000
  • Y finalmente, ha especificado que el protocolo de comunicación es websocket-s no un tcp-sockets.

Ejemplo con TCP-sockets:

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

Puede probar el servidor tcp usando, por ejemplo, telnet

$ telnet localhost 7788

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

Ejemplo con Web-sockets:

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

Puede probar el servidor web-socket usando wscat (o telnet también).

npm i -g wscat

$ wscat -c ws://localhost:7788

Connected (press CTRL+C to quit)
< {"cmd":"getuserlist","stn":true}
> {"sucess": {"count": 40}}
2
Ihor Sakailiuk 24 nov. 2019 a las 13:44