一對一通訊

Client A 發(fā)送類似的數(shù)據(jù)給 Server灾杰。Server 接收數(shù)據(jù)根據(jù) to 值找到 Client B 的 Socket 連接并將消息轉(zhuǎn)發(fā)給 Client B尼荆。

用戶登錄就把用戶存儲(chǔ)到在線用戶列表中去,觸發(fā)‘login’事件:

public里面chat.js進(jìn)行初始化:

function init() {
    socket = io();
    socket.emit('login', uid);
      ...
   }

www里面進(jìn)行更改:

 socket.on('login', function(usrName) {  
      var uid=usrName;
       users[uid] = socket.id;
       sockets[socket.id] = {uid:uid,socket:socket};
      online.push(uid);
  });

用戶給指定好友發(fā)送消息

public>chat.js里面進(jìn)行選擇好友進(jìn)行聊天:

function doChat() {
    fid = $(this).attr('id'); //獲取好友的id
    var fname = $(this).find("#friendName").text();
    $("#chatObj p").text(fname);
    setUnreadMsg();  //更改未讀的信息
    $(".historyMsg").prepend('<ul class="chatContent" id="v'+fid+'"></ul>');
    $(".historyMsg .chatContent").hide();
    $("#v"+fid).show(); //切換頁面到與該好友聊天的頁面
    initMsg(); //初始化與好友的歷史消息
}
//選擇好友聊天時(shí),初始化與好友的聊天記錄
function initMsg() {
    $.ajax({
        type: "POST",
        url: "/users/initMsg",
        dataType: "json",
        contentType: "application/json",
        data: JSON.stringify({
            'userId': uid,
            'fid': fid
        }),
        success: function (data) {
            for(var i=0; i<data.length;i++) {
                var fromID=data[i].from;
                var toId=data[i].to;
                if(uid == fromID) {
                    if(fid==toId) {
                        displayNewMsg('me', data[i].content);
                    }
                } else if(fid == fromID) {
                    if(uid ==toId){
                        displayNewMsg(fid,data[i].content);
                    }
                } else {
                    console.log("the news chat with others");
                }
            }
        }
  });
}

發(fā)送消息觸發(fā)private message事件

function doSend() {
    var msg=$('#messageInput').val();
    $('#messageInput').val('');
    socket.emit('private message',uid,fid,msg);
    displayNewMsg('me', msg);//把消息顯示到出來
    return false;
}

www里面private message事件

 socket.on('private message', function(uid,fid,message){
    var status;
    if(online.indexOf(fid)!==-1){
      status = 1;
      sockets[users[fid]].socket.emit('newMsg',fid,message);//找到好友的socket.id然后把消息發(fā)送給好友解虱,觸發(fā)chat.js的newMsg事件
    } else{
      // 如果不在線的話,狀態(tài)為0
      status = 0;
    }
//不管在不在線都把消息存到message數(shù)據(jù)庫中去
var data={
      userId: uid,
      from: uid,
      to: fid,
      status: status,
      content: message
    }
    //把消息存到數(shù)據(jù)庫中去
    dbHelper.addMsg(data,function (success,doc) {
      console.log("right");
    });

}

然后chat.js里面newMsg以及顯示消息displayNewMsg事件:

function init() {
     ···
      socket.on('newMsg', function(id,msg) {
        displayNewMsg(id, msg);
    });
}

function displayNewMsg(user, msg) {
    $("#v"+fid).append('<li class="'+(user === "me" ? "me" : "other")+'">'+
        '<div class="time">'+
        '<span>time</span>'+
        '</div>'+
        '<div class="msg">'+
        '<img src="/images/2.jpg" class="img-rounded">'+
        '<p>'+msg+'</p>'+
        '</div>'+
        '</li>'
    );
}

離線消息

之前把消息存到數(shù)據(jù)庫里面了用戶這邊和好友都要存漆撞,如果好友不在的話該好友的狀態(tài)信息 的狀態(tài)就設(shè)為0殴泰,如果好友在線的話,就把該好友的消息狀態(tài)設(shè)為1浮驳,

exports.addMsg = function(data, cb) {
  //這個(gè)地方獲取的是從ajax傳過來的數(shù)據(jù)
  var userMsg = new Msg({
      usrId: data.userId,
      from: data.from,
      to: data.to,
      content: data.content,
      status: 1
  });
  userMsg.save(function (err) {
    if(err){
      console.log(err)
    } else{
      console.log("user right");
      cb(null,entries);
    }
  })
  var friendMsg = new Msg({
    usrId: data.to,
    from: data.from,
    to: data.to,
    content: data.content,
    status: data.status
  });
  friendMsg.save(function (err) {
    if(err){
      console.log(err);
    } else{
      console.log("friend right");
      cb(null,entries);
    }
  });
}

用戶上線的時(shí)候有未讀消息:
初始化未讀消息:

function unreadMsg() {
  $.ajax({
    type: "POST",
    url: "/users/unreadMsg",
    dataType: "json",
    contentType: "application/json",
    data: JSON.stringify({
      'userId': uid
    }),
    success: function (data) {
      for(var i=0;i<data.length;i++){
        $('#'+data[i].from).find('.unreadMsg').show();
        $('#'+data[i].from).find('#friendName').css('margin-left','0');
        var j=$('#'+data[i].from).find('.unreadMsg').html();
        $('#'+data[i].from).find('.unreadMsg').html(parseInt(j)+1);//更改來自好友的未讀消息數(shù)量
      }
    }
  });
}
//路由
router.post('/unreadMsg', function(req, res, next) {
  dbHelper.unreadMsg(req.body,function (success, doc) {
    res.send(doc);
  });
});
//到數(shù)據(jù)庫中去查找來自好友的狀態(tài)為0的消息
exports.unreadMsg = function(data, cb) {
  Msg.find({usrId: data.userId,to: data.userId,status:0})
  // .populate('from')
    .exec(function(err,docs){
      var msgList = new Array();
      for(var i = 0;i < docs.length; i++) {
        msgList.push(docs[i].toObject());
      }
      cb(true,msgList);
    });
}

查看未讀消息
public chat.js里面

//更改未讀消息的顯示悍汛,查看之后就把消息的狀態(tài)設(shè)置為1
function setUnreadMsg(){
    $.ajax({
        type: "POST",
        url: "/users/setUnreadMsg",
        dataType: "json",
        contentType: "application/json",
        data: JSON.stringify({
            'userId': uid,
            'fid':fid
        }),
        success: function (data) {
            $('#'+fid).find('.unreadMsg').html('0');
            $('#'+fid).find('.unreadMsg').hide();
            $('#'+fid).find('#friendName').css('margin-left','10px');
        }
    });
}
//路由
router.post('/setUnreadMsg', function(req, res, next) {
  dbHelper.setUnreadMsg(req.body,function (success, doc) {
    res.send(doc);
  });
});
//dbHelper把消息的狀態(tài)更改為1
exports.setUnreadMsg = function(data, cb) {
  Msg.find({usrId: data.userId,from:data.fid,to: data.userId,status:0})
    .update({$set: {'status': 1}})
    .exec(function(err,docs){
      var msgList = new Array();
      for(var i = 0;i < docs.length; i++) {
        msgList.push(docs[i].toObject());
      }
      cb(true,msgList);
    });
}
遇到的問題:

測試的時(shí)候在同一個(gè)瀏覽器下打開兩個(gè)頁面進(jìn)行聊天的時(shí)候A發(fā)送給B的消息,B能收到至会,B回復(fù)給A的消息离咐,A卻收不到。

更改

發(fā)現(xiàn)是在同一個(gè)瀏覽器下共享同一個(gè)session奋献,在google設(shè)置增加一個(gè)用戶健霹,這樣就可以了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瓶蚂,隨后出現(xiàn)的幾起案子糖埋,更是在濱河造成了極大的恐慌,老刑警劉巖窃这,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞳别,死亡現(xiàn)場離奇詭異,居然都是意外死亡杭攻,警方通過查閱死者的電腦和手機(jī)祟敛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門腿宰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胀滚,“玉大人攒盈,你說我怎么就攤上這事黍衙。” “怎么了芒澜?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵随闺,是天一觀的道長虾标。 經(jīng)常有香客問我现拒,道長辣垒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任印蔬,我火速辦了婚禮勋桶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己例驹,他們只是感情好捐韩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眠饮,像睡著了一般奥帘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仪召,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音松蒜,去河邊找鬼扔茅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秸苗,可吹牛的內(nèi)容都是我干的召娜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惊楼,長吁一口氣:“原來是場噩夢啊……” “哼玖瘸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起檀咙,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤雅倒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后弧可,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔑匣,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年棕诵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了裁良。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡校套,死狀恐怖价脾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笛匙,我是刑警寧澤侨把,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站膳算,受9級(jí)特大地震影響座硕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涕蜂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一华匾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦蜘拉、人聲如沸萨西。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谎脯。三九已至,卻和暖如春持寄,著一層夾襖步出監(jiān)牢的瞬間源梭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工稍味, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留废麻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓模庐,卻偏偏與公主長得像烛愧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子掂碱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理怜姿,服務(wù)發(fā)現(xiàn),斷路器疼燥,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程沧卢,因...
    小菜c閱讀 6,409評(píng)論 0 17
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,761評(píng)論 0 15
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法悴了,內(nèi)部類的語法搏恤,繼承相關(guān)的語法,異常的語法湃交,線程的語...
    子非魚_t_閱讀 31,630評(píng)論 18 399
  • 盡管書看了厚厚一本熟空,但實(shí)際用起來,還是經(jīng)常會(huì)碰到一些問題搞莺。再次一一進(jìn)行記錄息罗。 Spring本質(zhì)是一個(gè)容器的管理工具...
    lionel880閱讀 821評(píng)論 0 0