Node.js 我可以使用UDP套接字执行类似recv的操作吗?
我是nodejs的新手,所以如果这个问题很愚蠢,请原谅我。当我用Python编写udp套接字时,我可以: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套接字接收数据的唯一方法 区别在于,如果我使用消息事件,我不知道这个消息是什么。我不确定您是否理解,因此,例如,我正在与服务器通信,第一次服务器向我发送“输
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');
});