套接字获取文本字符串作为十六进制数组,多个套接字相互调用's事件

Socket getting text string as hex array, multiple socket call in each other's event

本文关键字:套接字 调用 事件 字符串 取文本 获取 数组 十六进制      更新时间:2023-09-26

Client:

var iosocket = io.connect();
iosocket.on('connect', function () {
    iosocket.on('message', function(message) {
    console.log(message)
    });
});
$('#input').keypress(function(event) {
    if(event.which == 13) {
        event.preventDefault();
        iosocket.send($('#input').val());
    }
});

server: (ingnore require part)

var socket = require('socket.io');
conn = function (socket) {
    console.log("connnect");
    socket.on('disconnect', function (socket) {
    console.log("disconnect");
    });  
socket.on('message', function (data) {
    var socket1 = new net.Socket();
    socket1.connect (PORT, HOST, function() {
    socket1.write(data);
    socket1.end();
    });
    socket1.on('data', function(data) {
    socket.broadcast.emit('message', data);
    socket.emit('message',data);
    });
    socket1.on('error', function(exception){
    console.log('Exception:');
    console.log(exception);
    });
    socket1.on('drain', function() {
    console.log("socket1 drain!");
    });
    socket1.on('timeout', function() {
    console.log("socket1 timeout!");
    });
    socket1.on('close', function() {
    console.log('Socket1 closed');
    });
});
}
var io = socket.listen(server, { log: false });
io.sockets.on('connection', conn );

问题1(已解决,但需要反馈):我在客户端得到的响应(mkmessage变量)是十六进制数组格式,我尝试了setencoding和tostring方法,但它没有解决问题。以下代码将十六进制数组转换为可读字符串。

byte = '';
for (var i=0; i < data.length; i++) {
byte += String.fromCharCode( parseInt(data[i], 16).toString(16) );
}

问题2:每次都要创建tcp套接字socket1,这需要花费大量的时间。我如何创建和使用socket1,使它不会在每次写入后关闭?
在PORT HOST上侦听的其他家伙的状态是否强制它关闭?

您是否尝试显式设置套接字的编码?

socket.on('message', function (msg) {
    var socket1 = new net.Socket();
    socket1.setEncoding('utf8'); //< explicitly request utf8
    socket1.connect (PORT, HOST, function() {
        socket1.write(msg);
        socket1.end();
    });

查看NodeJS文档了解更多细节。

如果没有帮助,你可以分享TCP服务器在HOST:PORT监听的代码(参见socket1初始化)吗?

编辑

在下面的注释中提到:除非你在套接字上调用setEncoding(),否则'data'回调会接收Buffer对象。您应该将其转换为用于广播的String。

socket1.on('data', function(data) {
    socket.broadcast.emit('message', data.toString());
});