2015-09-07 33 views
0

我使用仅使用服务器和客户端的NodeJS设置了一个简单的聊天服务器。它可以工作,并且我可以在同一台机器上打开多个客户端窗口,但现在我需要更多一点。使用NodeJS的UDP聊天服务器中的用户名

我想:

  • 给每个客户端设置的用户名
  • 拥有从服务器
  • 行动命令,如客户端请求当前时间的选项“/我一拳术士”服务器将其他人显示为“用户打出术士”

这听起来像是一个快速的日子工作,但我刚开始看着UDP,我不能在网上找到任何其他示例服务器/客户端的东西,发送和获取消息。我将如何去完成这些任务? 代码:

Server.js:

var dgram = require('dgram'); //import datagram to get everything needed for UDP 

var PORT = 22222; 
var CLIENT_PORT = 2223; 

// An IP address that's reserved on each network 
// Gets sent to the server 
var ADDRESS = "-"; //dont want to show my IP :) 

var sock = dgram.createSocket({reuseAddr: true, type: 'udp4'}); //can now open multiple clients 

var current_time = Date.now(); //? 

function sendMessage(data) { 
    sock.send(data, 0, data.length, PORT, ADDRESS, function(err){ 
     if(err){ 
      throw err; 
     } 
    }); 
} 

sock.on("message", function(data, rinfo) { 
    //listen for messages and print them 
    console.log(data); 

    //Check if the client's port was equal to the port to find client data on 
    //If so, get packet 
    if (rinfo.port === CLIENT_PORT) { 
    console.log('\nreceived'); 

    //call function to broadcast the data out to everyone on the local network 
    sendMessage(data); 
} 


//Get the string data from the data buffer. 
var stringData = data.toString(); //also could be toJSON() 
console.log(stringData); 

//Convert that string back into a buffer by making a new Buffer and passing it in. 
//The buffer class can take a string, an array or just a number of bytes to allocate to memory 
var backToBuffer = new Buffer(stringData); //can take a string, array or just a size to allocate 
console.log(backToBuffer); 

}); 

//This opens the connection and starts listening 
//(Client Port, Address to listen to which is ALL, What to do) 
sock.bind(CLIENT_PORT, '', function(){ 

    sock.setBroadcast(true); 
    console.log('listening on port ' + PORT + "\n"); 

}); 

Client.js:

var dgram = require('dgram'); 

var SERVER_PORT = 22222; 
var PORT = 22223; 

var ADDRESS = "-"; 

//read input from the command line 
var stdin = process.stdin; 
var stdout = process.stdout; 

var sock = dgram.createSocket({reuseAddr: true, type: 'udp4'}); 

var server_sock = dgram.createSocket({reuseAddr: true, type: 'udp4'}); 

function sendMessage(data) { 
//onsole.log("sending data"); 
    sock.send(data, 0, data.length, PORT, ADDRESS, function(err) { 
     if(err) { 
      throw err; 
     } 
     //nsole.log("sent"); 
    }); 
} 

server_sock.on("message", function(data, rinfo) { 
    console.log("received " + data.toString()); 
}); 

server_sock.bind(SERVER_PORT, '', function() { 
    console.log('listening to server port'); 
}); 

sock.bind(PORT, '', function() { 
    sock.setBroadcast(true); 
    console.log("please enter a message\n"); 

    stdin.resume(); 

    stdin.on("data", function(data) { 
     sendMessage(data); 
    }); 
}); 

回答

0

的Node.js有库进行实时通信聊天的负荷,我不明白的选择使用UDP并自己管理所有内容,而且看起来你在这方面并不擅长。我的建议是使用的WebSocket库就像它可以socket.io他们甚至在他们的网站http://socket.io/get-started/chat/

一个简单的聊天的例子使用socket.io(或类似),它会帮助你很多,因为它有会话,以便您可以保存用户名并在每次发布消息时将其返回。 下面我写了一个服务器端的小例子(从上面的get-started的index.js中获得)。

io.on('connection', function(socket){ 
    var username = 'RANDOM'; 
    socket.on('chat message', function(msg){ 
    //here you should catch messages starting with "/" and parse them to write a different message 
    io.emit('chat message', username + ': ' msg); 
    }); 
    socket.on('update username', function(msg) { 
    username = msg; 
    io.emit('username changed', username); 
    }); 
}); 

我希望它有帮助。

+0

我的问题是,我需要阅读用户输入。我不需要socket.io,而是readline方法:https://nodejs.org/api/readline.html。不过谢谢你,socket对于未来的项目来说看起来不错。 –

+0

您可以读取输入,然后通过socket.io发送。或者我可能没有明白这一点 – DevAlien