2014-04-26 71 views
0

我是新来的nodejs,所以请原谅我,如果这个问题是愚蠢的。当我用Python编写udp socket时,我可以这样做:我可以使用UDP套接字来做类似recv的事吗?

socket.recvfrom(len) # socket is udp 
do_something_else 
socket.recvfrom(len) 

并且一次接收一定数量的数据。 我读过关于UDP的节点的doc,看来这是UDP套接字接收数据的唯一方法。

Event: ‘message’ 
• msg Buffer object. The message 
• rinfo Object. Remote address information 
Emitted when a new datagram is available on a socket. msg is a Buffer and rinfo is an object with the 
sender’s address information: 

socket.on(’message’, function(msg, rinfo) { 
    console.log(’Received %d bytes from %s:%d\n’, 
    msg.length, rinfo.address, rinfo.port); 
}); 

不同的是,如果我使用的消息事件,我不知道这条消息是什么。我不确定你是否理解,例如,我正在与服务器进行通信,第一次服务器发送给我"enter your name",并且我在do_something_else中发回了我的名字,然后收到id。通过recvfrom我可以控制过程,因为我知道接下来会发生什么,但对于我如何在消息事件中执行此操作并不明显。

谢谢。

回答

0

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

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 
    } 
}); 
+0

我可以,但事情是味精是不是很明显区分。我可能会得到两个数字,但它们表示不同的含义。我希望你明白。 – laike9m

+0

然后使用一个变量来保存用户/客户端的当前状态。看到我更新的答案 – micnic

+0

这就是我决定要做的事情。 – laike9m

0

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

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'); 
}); 
相关问题