一对一通讯

Client A 发送类似的数据给 Server。Server 接收数据根据 to 值找到 Client B 的 Socket 连接并将消息转发给 Client B。

用户登录就把用户存储到在线用户列表中去,触发‘login’事件:

public里面chat.js进行初始化:

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

www里面进行更改:

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

用户给指定好友发送消息

public>chat.js里面进行选择好友进行聊天:

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(); //初始化与好友的历史消息
}
//选择好友聊天时,初始化与好友的聊天记录
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");
                }
            }
        }
  });
}

发送消息触发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然后把消息发送给好友,触发chat.js的newMsg事件
    } else{
      // 如果不在线的话,状态为0
      status = 0;
    }
//不管在不在线都把消息存到message数据库中去
var data={
      userId: uid,
      from: uid,
      to: fid,
      status: status,
      content: message
    }
    //把消息存到数据库中去
    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>'
    );
}

离线消息

之前把消息存到数据库里面了用户这边和好友都要存,如果好友不在的话该好友的状态信息 的状态就设为0,如果好友在线的话,就把该好友的消息状态设为1,

exports.addMsg = function(data, cb) {
  //这个地方获取的是从ajax传过来的数据
  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);
    }
  });
}

用户上线的时候有未读消息:
初始化未读消息:

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);//更改来自好友的未读消息数量
      }
    }
  });
}
//路由
router.post('/unreadMsg', function(req, res, next) {
  dbHelper.unreadMsg(req.body,function (success, doc) {
    res.send(doc);
  });
});
//到数据库中去查找来自好友的状态为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里面

//更改未读消息的显示,查看之后就把消息的状态设置为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把消息的状态更改为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);
    });
}
遇到的问题:

测试的时候在同一个浏览器下打开两个页面进行聊天的时候A发送给B的消息,B能收到,B回复给A的消息,A却收不到。

更改

发现是在同一个浏览器下共享同一个session,在google设置增加一个用户,这样就可以了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,672评论 18 139
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,432评论 0 17
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,772评论 0 15
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,645评论 18 399
  • 尽管书看了厚厚一本,但实际用起来,还是经常会碰到一些问题。再次一一进行记录。 Spring本质是一个容器的管理工具...
    lionel880阅读 821评论 0 0