Node.js(Express4.x)搭建聊天室2——消息發(fā)送與監(jiān)聽

0.目標與前置條件

這一節(jié)窄俏,我將實現(xiàn)用戶修改昵稱與收發(fā)消息。

修改昵稱與收發(fā)消息

這一節(jié)內(nèi)容是在上一節(jié)完成的情況下進行的曹傀,請先參照上一節(jié)完成基本框架的搭建:
Node.js(Express4.x)搭建聊天室1——基本框架


我把搭建聊天室的步驟分成了幾個部分舱殿,請按順序閱讀:

獲取代碼
Node.js(Express4.x)搭建聊天室1——基本框架
Node.js(Express4.x)搭建聊天室2——消息發(fā)送與監(jiān)聽
Node.js(Express4.x)搭建聊天室3——完善網(wǎng)頁


1. 服務端

接下來的代碼,要添加到model/chatroom.js的“//在這里添加更多監(jiān)聽的消息”后面:

      /* *************** 更改昵稱 *************** */
      socket.on('change_name', function (newname) {
        if (addedUser) {
            var oldname = socket.username;
            socket.username = newname;

            // 告知所有用戶
            socket.broadcast.emit('name_changed', {
                username: newname,
                msg: "["+oldname+"] 改名為 ["+socket.username + "]",
                type: "BROADCAST",
                numUsers: guest_num
            });
        }
      });
      
      
      /* *************** 發(fā)送消息 *************** */
      socket.on('send_msg', function (msg) {
        if (addedUser) {

            // 廣播消息
            socket.broadcast.emit('msg_sent', {
                username: socket.username,
                msg: msg,
                type: "BROADCAST",
            });
        }
      });

我在這里新增了兩個監(jiān)聽接口:

  • change_name:當服務端接收到該消息時就轧,會將一起傳來的newname替換用戶當前的username证杭,并存儲在socket.username中,然后廣播告知所有用戶妒御。
  • send_msg:當服務端接收到該消息時解愤,將把一起傳來的msg廣播給所有用戶。

2. 客戶端

在views/index.jade文件中乎莉,在“// 添加更多的消息發(fā)送或監(jiān)聽”后面添加如下代碼:

//修改昵稱
function change_name(name){
    socket.emit('change_name', name, function (data) {
        console.log(data);
    });
}
// 監(jiān)聽修改昵稱后返回的消息
socket.on('name_changed', function (data) {
    console.log(data);
});

//發(fā)送消息
function send_msg(msg){
    socket.emit('send_msg', msg, function (data) {
        console.log(data);
    });
}
// 監(jiān)聽消息
socket.on('msg_sent', function (data) {
    console.log(data);
});

這里我們定義了兩個函數(shù):

  • change_name:調(diào)用后琢歇,客戶端向服務端發(fā)送“change_name”消息,從而把自己的昵稱修改為name梦鉴。
  • send_msg:調(diào)用后,客戶端向服務器端發(fā)送“send_msg”消息揭保,服務端會把msg廣播給所有用戶肥橙。

對應的,我們還新增了兩個監(jiān)聽:

  • name_changed:監(jiān)聽服務端發(fā)出的“name_changed”消息秸侣。當聊天室中有用戶修改了昵稱后存筏,服務端會向所有人發(fā)出該消息宠互。
  • msg_sent: 監(jiān)聽服務端發(fā)出的“msg_sent”消息。當聊天室中有用戶發(fā)出消息椭坚,服務端會轉(zhuǎn)發(fā)給所有人予跌。

3.整理一下思路

當客戶端1發(fā)出“change_name”消息給服務端后,服務端會修改該用戶的昵稱善茎,并廣播一條“name_changed”的消息給所有用戶(這里是客戶端2和客戶端3)券册,如下圖所示:

修改昵稱的流程

當客戶端1發(fā)出“send_msg”消息給服務端后,服務端廣播一條“msg_sent”的消息給所有用戶(這里是客戶端2和客戶端3)垂涯,如下圖所示:

發(fā)送消息和監(jiān)聽消息

4.測試

分別打開兩個瀏覽器A烁焙、B,訪問http://127.0.0.1:3000耕赘。

在瀏覽器B的控制臺中骄蝇,輸入change_name("Mike的讀書季"),即把瀏覽器B的用戶昵稱改為“Mike的讀書季”操骡;執(zhí)行后九火,在瀏覽器A中會收到“[Mike] 改名為 [Mike的讀書季]”的消息。

在瀏覽器B的控制臺中册招,輸入send_msg("歡迎你們岔激!"),即瀏覽器B的用戶發(fā)送消息“歡迎你們跨细!”鹦倚;執(zhí)行后,在瀏覽器A中會收到“歡迎你們冀惭!”的消息震叙。

更改昵稱和發(fā)送消息

5.小結(jié)

至此,一個聊天室的“骨架”就算搭好了散休。接下來媒楼,為了讓這個聊天室真正可用,還要在客戶端的頁面上做一些處理戚丸;這個應該是前端工程師的工作划址,不過作為一個Node工程師,通吃前后端本來就是應該的限府,所以我打算越俎代庖夺颤,把前端也一起做了。

歡迎閱讀下一節(jié):
Node.js(Express4.x)搭建聊天室3——完善網(wǎng)頁


原創(chuàng)文章胁勺,未經(jīng)許可世澜,請勿轉(zhuǎn)載
作者:Mike的讀書季
日期:2016.09.20
QQ:1139904786
Blog:http://blog.csdn.net/kkdestiny

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市署穗,隨后出現(xiàn)的幾起案子寥裂,更是在濱河造成了極大的恐慌嵌洼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件封恰,死亡現(xiàn)場離奇詭異麻养,居然都是意外死亡,警方通過查閱死者的電腦和手機诺舔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門鳖昌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人混萝,你說我怎么就攤上這事遗遵。” “怎么了逸嘀?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵车要,是天一觀的道長。 經(jīng)常有香客問我崭倘,道長翼岁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任司光,我火速辦了婚禮琅坡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘残家。我一直安慰自己榆俺,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布坞淮。 她就那樣靜靜地躺著茴晋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪回窘。 梳的紋絲不亂的頭發(fā)上诺擅,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音啡直,去河邊找鬼尔当。 笑死植影,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的聪建。 我是一名探鬼主播蛮拔,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疲酌,長吁一口氣:“原來是場噩夢啊……” “哼涮毫!你這毒婦竟也來了匿刮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎继效,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體装获,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡瑞信,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了穴豫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凡简。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖精肃,靈堂內(nèi)的尸體忽然破棺而出秤涩,到底是詐尸還是另有隱情,我是刑警寧澤司抱,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布筐眷,位于F島的核電站,受9級特大地震影響习柠,放射性物質(zhì)發(fā)生泄漏匀谣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一资溃、第九天 我趴在偏房一處隱蔽的房頂上張望武翎。 院中可真熱鬧,春花似錦溶锭、人聲如沸宝恶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垫毙。三九已至,卻和暖如春驻售,著一層夾襖步出監(jiān)牢的瞬間露久,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工欺栗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毫痕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓迟几,卻偏偏與公主長得像消请,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子类腮,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容