LayIM接入案例Node.js篇,带node源码和体验地址,快来试试吧。

提问 未结 精帖
18 14834
我是隔壁云老王
悬赏:5飞吻
这几天大家都陆续接入了layim,我把我做的也展示出来吧。
体验网址 :http://im.77wx.cn/

所用到的东西:
登陆:微信扫码登陆
socket:node.js
处理好友关系:php
图片上传:七牛
文件上传:七牛
聊天记录:无

控制台丑了点



试过10个人同时在线没啥问题 ,人多还没做测试

首先下载node 然后安装,然后npm install express socket.io
接着把 一下代码保存为 test.js
最后 打开命令窗口 node test.js 就OK了

我的前端水平有限,对node不是很熟悉,所以下面node的代码是有隐患的,不适合直接放到生产环境,仅做体验用!

我正研究拍黄片,喔不 是正研究php版本中[哈欠] ,过两天把php版本的domo 开放出来




node 源码
var app = require('express')(),
server = require('http').createServer(app),
io = require('socket.io').listen(server);
server.listen(3000);
var user = {};
io.on('connection', function(socket) {
socket.on('message', function(d) {
switch (d.type) {
case 'reg':
user[d.content.uid] = socket.id;
socket.broadcast.emit('addList', d.content);
console.log('用户上线了:用户id=' + d.content.uid + '| 客户端id=' + socket.id);
break;
case 'chatMessage':
var mydata = {
username: d.content.mine.username,
avatar: d.content.mine.avatar,
id: d.content.mine.id,
content: d.content.mine.content,
type: d.content.to.type,
toid: d.content.to.id
};
if (d.content.to.type == 'friend') {
if (user[mydata.toid]) {
io.sockets.sockets[user[mydata.toid]].emit('chatMessage', mydata);
console.log('【' + d.content.mine.username + '】对【' + d.content.to.username + '】说:' + d.content.mine.content)
} else {
socket.emit('noonline', mydata)
}
} else if (d.content.to.type == 'group') {
mydata.id = mydata.toid;
socket.broadcast.emit('chatMessage', mydata)
}
break
}
}).on('disconnect', function() {
for (x in user) {
if (user[x] == socket.id) {
console.log(user[x] + '下线了');
user[x] = null
}
}
})
});
遇到的问题是:处理好友关系比较费劲。
我希望 addList 给面板添加好友的时候可以加一个 检测,如果好友已经在面板上了 就不添加了,如果好友不在面板上才执行 新增到面板 。

如果可以的话 也可以加一个 重新加载json 重新把好友渲染到面板。


回帖
  • @Wood
    来吧
    2 回复
  • node 的服务端源码 已经全部完成了 我把改进版的代码也发一下 有需要的同学可以参考下

    DEMO地址: http://im.77wx.cn/
    var app = require('express')(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server);
    /*监听端口*/
    server.listen(3000);
    /*初始化用户对象用了分发消息,*/
    var user = {};
    io.on('connection', function(socket) {
    /*开始捕捉事件*/
    socket.on('message', function(d) {
    switch (d.type) {

    /*用户上线*/
    case 'reg':
    user[d.content.uid] = socket.id;
    var num=0,uuser=[];
    for (x in user){
    uuser.push(x);
    num++;
    }
    d.content.num=num;

    //全局事件
    socket.broadcast.emit('addList', d.content);


    ///发给自己
    var reguser={uuser:uuser,num:num};
    socket.emit('reguser', reguser);

    console.log('用户上线了:用户id=' + d.content.uid + '| 客户端id=' + socket.id);
    break;

    /*用户发送消息*/
    case 'chatMessage':
    var mydata = {
    username: d.content.mine.username,
    avatar: d.content.mine.avatar,
    id: d.content.mine.id,
    content: d.content.mine.content,
    type: d.content.to.type,
    toid: d.content.to.id
    };

    /*处理单聊事件*/
    if (d.content.to.type == 'friend') {
    if (user[mydata.toid]) {/*广播消息*/
    io.sockets.sockets[user[mydata.toid]].emit('chatMessage', mydata);
    console.log('【' + d.content.mine.username + '】对【' + d.content.to.username + '】说:' + d.content.mine.content)
    } else {
    socket.emit('noonline', mydata);
    }


    /*处理群聊事件*/
    } else if (d.content.to.type == 'group') {
    mydata.id = mydata.toid;
    socket.broadcast.emit('chatMessage', mydata)
    }
    break
    }

    /*注销事件*/
    }).on('disconnect', function() {
    var outid=0,usernum=0;
    for (x in user) {
    usernum++;
    if (user[x] == socket.id) {
    outid=x
    delete user[x]
    }
    }
    console.log('用户ID=' + outid + '下线了');
    var out={id:outid,num:usernum-1}
    io.sockets.emit('out',out);
    })
    });
    1 回复
  • 莫忘
    2017-3-1
    客户端源码可以共享一下吗
    1 回复
  • 泠三令
    2016-7-6
    不错,已围观![爱你]
    0 回复
  • 泠三令
    2016-7-6
    想了想数据库的结构,感觉有些复杂啊。你咋设计的,分享下噻。
    0 回复
  • @泠三令 数据库的构造反而很简单
    用户表
    群表
    好友表
    聊天记录 (如果需要的话)
    0 回复
  • [good]
    0 回复
  • [good] [good]
    0 回复
  • 泠三令
    2016-7-7
    @我是隔壁老王 我就是在想聊天记录的表格该怎样设计才比较方便聊天记录页查看。
    0 回复
  • Warn
    2016-7-7
    [good] 大赞,期待php的demo学习
    0 回复
  • @泠三令 我没做过 如果你指的是mysql建表的话, 我想的就是把 from id | to.id | time | content | flag 这样就可以了呀?
    如果你指的是前端页面,这个参考QQ之类的就可以了
    0 回复
  • iseeyo
    2016-7-8
    期待楼主放出拍黄片demo[偷笑]
    0 回复
  • @iseeyo 来了
    0 回复
  • xgqfrms
    2016-8-24
    [囧]
    0 回复
  • legein
    2016-9-13
    楼主,github上有例子参考下吗
    0 回复
  • 楼主,有例子能够参考下吗?
    0 回复
  • [微笑] 可以看看前端的代码吗,有偿的
    0 回复
  • node.js
    0 回复
本帖已设置禁止回复