簡體   English   中英

使用NodeJS的UDP聊天服務器中的用戶名

[英]Usernames in a UDP chat server with NodeJS

我正在使用NodeJS設置一個簡單的聊天服務器,該服務器僅使用服務器和客戶端。 它可以工作,並且我可以在同一台計算機上打開多個客戶端窗口,但是現在我需要更多。

我想要:

  • 為每個客戶提供設置用戶名的選項
  • 讓客戶端從服務器請求當前時間
  • 諸如“ /我打術士”之類的操作命令,服務器將其他顯示為“用戶打術士”

這聽起來似乎工作很忙,但是我只是開始研究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);
    });
});

Node.js擁有大量的庫來進行實時通信聊天,我不理解選擇使用UDP並自己管理所有內容的選擇,而且您似乎對此並不十分熟練。 我的建議是使用websocket庫,例如socket.io,甚至在他們的網站http://socket.io/get-started/chat/中也有一個簡單的聊天示例。

使用socket.io(或類似工具)將為您提供很多幫助,因為它具有會話,因此您可以保存用戶名並在每次發布消息時將其返回。 下面,我寫了一個服務器端的小例子(取自上面入門的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);
  });
});

希望對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM