繁体   English   中英

NodeJS如何使用原始十六进制发送TCP数据包

[英]NodeJS how to send a TCP packet with raw Hex

我是 node 的新手,并试图编写发送原始十六进制数据的最小 tcp 客户端。 如果我应该使用缓冲区,那么如何使用? 如果我可以将十六进制作为字符串发送,那么如何发送? 非常感谢指导!

继承人当前的,不工作的代码:

var hexVal = `504f5354202f6c696e653320485454502f312e310d0a557365722d4167656e743a206e6f64652d6170700d0a4163636570743a202a2f2a0d0a686f73743a203139322e3136382e31342e39343a333030300d0a636f6e74656e742d747970653a206170706c69636174696f6e2f6a736f6e0d0a636f6e74656e742d6c656e6774683a2031390d0a436f6e6e656374696f6e3a20636c6f73650d0a0d0a227b757365726e616d653a202776616c277d22` // my raw hex, unwantendly sent as string


var net = require('net');

var HOST = '192.168.14.94';
var PORT = 3000;

var client = new net.Socket();
client.connect(PORT, HOST, function() {
    console.log('CONNECTED TO: ' + HOST + ':' + PORT);
    client.write(hexVal);
});

client.on('data', function(data) { // 'data' is an event handler for the client socket, what the server sent
    console.log('DATA: ' + data);
    client.destroy(); // Close the client socket completely

});

// Add a 'close' event handler for the client socket
client.on('close', function() {
    console.log('Connection closed');
});

服务器:

nc -lvp 3000

这解决了它:

var bytesToSend = [0x50, 0x4f, ...],
    hexVal = new Uint8Array(bytesToSend);

给定一个十六进制字符串,将它作为原始字节发送,有一种更方便的方法可以做你想做的事。

目前,您正在使用Uint8Array ,其中每个字节都需要编码为0x41或其他Uint8Array

但是,给定一个十六进制字符串,您可以像这样准备一个原始的十六进制缓冲区:

const hexString = "41424344";
const rawHex = Buffer.from(hexString, 'hex');

然后你可以将缓冲区写入套接字:

let client = new net.Socket();
client.connect(PORT, IP, () => {
    console.log("Connected");
    client.write(rawHex); //This will send the byte buffer over TCP
})

希望这可以帮助

你需要先设置服务器!!!

然后只有这样客户端才能连接到它......

var net = require('net');
var config = {
    host: 'localhost',
    port: 3000
};

// var hexVal = `POST /line3 HTTP/1.1
// User-Agent: node-app
// Accept: */*
// host: 192.168.14.94:3000
// content-type: application/json
// content-length: 19
// Connection: close

// "{username: 'val'}"`

var hexVal = `504f5354202f6c696e653320485454502f312e310d0a557365722d4167656e743a206e6f64652d6170700d0a4163636570743a202a2f2a0d0a686f73743a203139322e3136382e31342e39343a333030300d0a636f6e74656e742d747970653a206170706c69636174696f6e2f6a736f6e0d0a636f6e74656e742d6c656e6774683a2031390d0a436f6e6e656374696f6e3a20636c6f73650d0a0d0a
227b757365726e616d653a202776616c277d22` // my raw hex, unwantendly sent as string

var move = {
    forward: hexVal,
    backward: 'READER_BWD'
};

///////////////////////////////////////////////////////////////////////////////////

/* server code */

let server = net.createServer((client) => {
  console.log('client connected');

  client.on('data', data => {
    console.log(data.toString());
    client.write('ACK')
  })

  client.on('end', () => console.log('ended session'))
})
server.listen(3000)

//////////////////////////////////////////////////////////////////////////////

/* client code */

var client = new net.Socket();

client.connect(3000, 'localhost', function () {
        console.log('connected to ' + config.host + ':' + config.port);
        client.write(move.forward, function () {
            console.log('move forward command sent');
        });
});

client.on('data', function (data) {
    var str = data.toString();
    if (str === 'ACK') {
        console.log('ACK received');
        client.write(move.backward, function () {
            console.log('move backward sent');
            client.end();
        });
    }
});

client.on('end', () => {
  console.log('disconnected from server');
});

client.on('error', function (err) {
    console.log('Error : ', err);
});

client.on('close', function () {
    console.log('socket closed');
});


您甚至可以将服务器和客户端的代码拆分为两个单独的文件...

然后先启动服务器,然后启动客户端

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM