nodejs消息隊列,nodejs初探(四)實現一個多人聊天室

 2023-11-19 阅读 29 评论 0

摘要:樣例地址http://www.lxrtalk.com/ 我們實現的思路是,當有一個人發送過來消息,我們就廣播給其他客戶端。 var net = require('net'); var chatServer = net.createServer(),clientList = [];//已連接的client列表 chatServer.on('connec

樣例地址http://www.lxrtalk.com/

我們實現的思路是,當有一個人發送過來消息,我們就廣播給其他客戶端。

var net = require('net');
var chatServer = net.createServer(),clientList = [];//已連接的client列表
chatServer.on('connection', function(client) {// name 的自定義屬性,用于表示哪個客戶端(客戶端的地址+端口為依據)client.name = client.remoteAddress + ':' + client.remotePort;client.write('Hi ' + client.name + '!\n');//加入在線列表
    clientList.push(client);client.on('data', function(data) {broadcast(buffer, client);// 發送給其他客戶端
    });client.on('end', function() {//從在線列表中移除clientList.splice(clientList.indexOf(client), 1); });
});
chatServer.listen(9000);
 

這里broadcast方法發送給其他客戶端,代碼如下

function broadcast(message, client) {for(var i=0;i<clientList.length;i+=1) {//發送給其他人if(client !== clientList[i]) {var msg=client.name + " says: " + message;console.log(msg);clientList[i].write(msg);}}
}

但此時,我們會發現,每發送一個字符,其他客戶端都會收到一條消息。

nodejs消息隊列、比如我們發送”abcd“,如果client.name為”192.168.1.2:5486“,其他用戶收到的是:
192.168.1.2:5486 says: a
192.168.1.2:5486 says: b
192.168.1.2:5486 says: c
192.168.1.2:5486 says: d

此時,我們需要考慮分割符將我們要發送的完整的一句話分開,最終我采取的是回車換行分割。最終代碼如下:

// 在前者的基礎上,實現 Client --> Sever 的通訊,如此一來便是雙向通訊
var net = require('net');
var chatServer = net.createServer(),clientList = [];//已連接的client列表
var clientsBuffer={};
//telnet 127.0.0.1 9000
chatServer.on('connection', function(client) {// name 的自定義屬性,用于表示哪個客戶端(客戶端的地址+端口為依據)client.name = client.remoteAddress + ':' + client.remotePort;client.write('Hi ' + client.name + '!\n');clientList.push(client);clientsBuffer[client.name]=new Buffer(0);//發送消息的緩存client.on('data', function(data) {console.log(data);var myBuffer=clientsBuffer[client.name];console.log(myBuffer);//以回車換行為分割if(data.equals(new Buffer([0x0d,0x0a]))){broadcast(myBuffer, client);// 接受來自客戶端的信息clientsBuffer[client.name]=new Buffer(0);//清空緩存}else{//將發送過來的字符拼入緩存中var buflist=[myBuffer,data];clientsBuffer[client.name]=Buffer.concat(buflist,myBuffer.length+data.length);}});client.on('end', function() {clientList.splice(clientList.indexOf(client), 1); // 刪除數組中的制定元素。這是 JS 基本功哦~
    });client.on('error', function(e) {console.log(e);});
});
/*** 廣播給其他所有用戶* @param message 消息內容* @param client 發送人客戶端*/
function broadcast(message, client) {var cleanup = [];//需要銷毀的列表for(var i=0;i<clientList.length;i+=1) {if(client !== clientList[i]) {if(clientList[i].writable) { // 先檢查 sockets 是否可寫var msg=client.name + " says " + message;console.log(msg);clientList[i].write(msg);} else {cleanup.push(clientList[i]) // 如果不可寫,收集起來銷毀。銷毀之前要 Socket.destroy() 用 API 的方法銷毀。
                clientList[i].destroy()}}}//銷毀for(i=0;i<cleanup.length;i+=1) {clientList.splice(clientList.indexOf(cleanup[i]), 1)}
}
chatServer.listen(9000);

?

轉載于:https://www.cnblogs.com/lixiaoran/p/5041015.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/180672.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息