2014-04-26 18 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'); 
}); 
相關問題