Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 我可以使用UDP套接字执行类似recv的操作吗?_Node.js_Udp - Fatal编程技术网

Node.js 我可以使用UDP套接字执行类似recv的操作吗?

Node.js 我可以使用UDP套接字执行类似recv的操作吗?,node.js,udp,Node.js,Udp,我是nodejs的新手,所以如果这个问题很愚蠢,请原谅我。当我用Python编写udp套接字时,我可以: socket.recvfrom(len) # socket is udp do_something_else socket.recvfrom(len) 一次接收一个特定长度的数据。 我已经阅读了node关于UDP的文档,似乎这是UDP套接字接收数据的唯一方法 区别在于,如果我使用消息事件,我不知道这个消息是什么。我不确定您是否理解,因此,例如,我正在与服务器通信,第一次服务器向我发送“输

我是nodejs的新手,所以如果这个问题很愚蠢,请原谅我。当我用Python编写udp套接字时,我可以:

socket.recvfrom(len)  # socket is udp
do_something_else
socket.recvfrom(len)
一次接收一个特定长度的数据。 我已经阅读了node关于UDP的文档,似乎这是UDP套接字接收数据的唯一方法

区别在于,如果我使用消息事件,我不知道这个消息是什么。我不确定您是否理解,因此,例如,我正在与服务器通信,第一次服务器向我发送
“输入您的姓名”
,我在
中将我的姓名发送回它,然后接收
id
。通过
recvfrom
我可以控制这个过程,因为我知道接下来会发生什么,但我不清楚如何使用消息事件来实现这一点


多谢各位

我真的不明白你的问题,你能不能这样做:

var states = {
        invalid_data_received: -1,
        nothing_received: 0,
        received_name: 1,
        received_some_data: 2
    },
    state = states.nothing_received;

socket.on(’message’, function(msg, rinfo) {
    msg = msg.toString();
    if (state === states.nothing_received) {
        do_something(msg);
    } else if (state === states.received_name) {
        do_something_else(msg);
    } else if (state === states.received_some_data) {
        do_even_more(msg);
    } else if (state === states.invalid_data_received) {
        // incorrect message received
    }
});

查看此聊天演示。它使用散列来存储用户。它展示了你问题的解决方案

var net = require("net");
var count = 0, users = {};
var server = net.createServer(function (conn){
var nickname;
conn.setEncoding('utf8');
conn.write(' > welcome to \033[92mnode-chat\033[39m!'
    + '\n > ' + count + ' other people are connected at this time.'
    + '\n > please write your name and press enter: ');
count++;
conn.on('data', function (data){
    data = data.replace('\r\n', '');
    if(!nickname) {//sending msg is username
        if(users[data]) {
            conn.write('\033[93m > nickname already in use. Try again:\033[39m ');
            return;
        } else {
            nickname = data;
            users[nickname] = conn;

            for(var i in users) {
                users[i].write('\033[90m > ' + nickname + ' joined the room\033[39m\n');
            }
        }
    } else {//sending msg is normal chat message
        for(var i in users) {
            if(i != nickname) {
                users[i].write('\033[96m > ' + nickname + ':\033[39m ' + data + '\n');
            }
        }
    }
});
conn.on('close', function(){
    count--;
    delete users[nickname];
    //conn.write('\033[90 > ' + nickname + ' left the room\033[39m\n');
    Object.keys(users).forEach(function (user) {
    users[user].write(nickname + ' left the room');
  });
});
conn.on('error', function(){
    console.log('\033[96m error occur.  \033[39m');
}
);

});
server.listen(3000, function (){
    console.log('\033[96m   server listening on *:3000\033[39m');
});

我可以,但问题是味精没有那么明显的区别。我可能会得到两个数字,但它们代表不同的含义。我希望您能理解。然后使用变量保存用户/客户端的当前状态。看看我最新的答案,这就是我决定做的。
var net = require("net");
var count = 0, users = {};
var server = net.createServer(function (conn){
var nickname;
conn.setEncoding('utf8');
conn.write(' > welcome to \033[92mnode-chat\033[39m!'
    + '\n > ' + count + ' other people are connected at this time.'
    + '\n > please write your name and press enter: ');
count++;
conn.on('data', function (data){
    data = data.replace('\r\n', '');
    if(!nickname) {//sending msg is username
        if(users[data]) {
            conn.write('\033[93m > nickname already in use. Try again:\033[39m ');
            return;
        } else {
            nickname = data;
            users[nickname] = conn;

            for(var i in users) {
                users[i].write('\033[90m > ' + nickname + ' joined the room\033[39m\n');
            }
        }
    } else {//sending msg is normal chat message
        for(var i in users) {
            if(i != nickname) {
                users[i].write('\033[96m > ' + nickname + ':\033[39m ' + data + '\n');
            }
        }
    }
});
conn.on('close', function(){
    count--;
    delete users[nickname];
    //conn.write('\033[90 > ' + nickname + ' left the room\033[39m\n');
    Object.keys(users).forEach(function (user) {
    users[user].write(nickname + ' left the room');
  });
});
conn.on('error', function(){
    console.log('\033[96m error occur.  \033[39m');
}
);

});
server.listen(3000, function (){
    console.log('\033[96m   server listening on *:3000\033[39m');
});