简易聊天室

前言

本来我做的这个简易聊天室程序是想上课堂展示的,但是这个idea和我的好朋友本门课程的大作业有一些相似,所以为了不尴尬,我就不上去展示。
我就展示给简书上面感兴趣的用户吧,希望大家能够欣赏,从中收获到一些东西。

整个项目的github地址

前端设计

对于前端的设计,这个真的是很考验一个人的审美观,我想我也很难讲明白,我就讲讲我的设计灵感吧。或许你能够从中受到一些启发,设计出更加出色的聊天室。

整个界面如图所示

image.png

对于整个聊天室的顶端,是一个仿Mac的设计,主要的作用是用来显示,当前聊天室的名称。其实,一开始我是没有想到这样的设计,但是我在观看socket.io官网主页的时候,发现这是一个不错的设计,所以我就提取了其中的html和css作为自己聊天室的顶部栏。

至于侧边栏显示当前用户的头像和昵称,我是借鉴了微信的设计,但是代码并没有抄微信的,而是根据这个排版,自己去设计。
至于在线人数的设计,我是参考了这个网站的设计MDBootstrap, 我觉得这个框架是基于Bootstrap进一步的美化,所有的控件我觉得都是做的非常好看,至少比Bootstrap的好看,希望自己的网页炫酷的可以看看这个。

至于左边用户显示栏,一开始我想的是用<ul>布局,后来觉得有点麻烦,还是改用<div> 布局吧。我觉得比较重要的一点就是关注用 float来对齐,让某一个元素脱离文档流。

至于消息气泡的设计,就是一个圆角矩形 + 一个三角形,至于三角形的制作,就是将widthheight 全部设为0, 通过设置 border,设置一面有颜色,其余三面都是透明,就可以实现这个效果。

聊天的效果图

GIF.gif

后端开发

后端的开发主要是 nodejs + angularjs + express + socket.io

其中 nodejs 主要用于服务端开发,angularjs 用于数据绑定,将更改后的数据快速映射到前端页面。socket.io用于通信,消息传递。

其中,服务端开启监听端口,监听客户端的连接,每次监听到客户端的连接时,负责随机为用户生成一个昵称和头像,以及一个uid用来标识用户。

服务端监听到客户端连接的代码如下:

socket.uid = uuidv4();
var userinfo = randomUserInfo();
socket.nickname = userinfo.nickname;
socket.avatar = userinfo.avatar;

connectedSockets[socket.uid] = socket;
userinfo.uid = socket.uid;
userinfo.tag = 'user';
userinfo.hasMessages = 0;
allUsers.push(userinfo);

socket.emit('accept', userinfo);
socket.broadcast.emit('userAdded', userinfo);
socket.emit("allUser", allUsers);

当服务器接收到发送消息的请求是,首先判断这个发送的消息是给特定的用户还是群聊消息,如果是特定的用户,只需要找到对应用户的socket,即可发送相应的消息;如果是群聊消息,则需要将这条消息广播出去。

对应的代码如下:

socket.on('addMessage',function(data){ //有用户发送新消息
    data.position = 'left';
    if(data.to.tag === "user"){//发给特定用户
        connectedSockets[data.to.uid].emit('messageAdded',data);
    }else{//群发
        socket.broadcast.emit('messageAdded',data);//广播消息,除原发送者外都可看到
    }
});

客户端要做的就是,当用户点击发送按钮,或者按下回车键之后,构造发送的消息,消息的字段包括了发送者,接收者,发送内容,消息的显示位置等信息。
还有就是判断当前的是否是群聊,如果是群聊,则需要将消息广播出去。
具体实现的代码如下:

$scope.postMessage = function() {
    var msg = {
        content: $scope.chatContent,
        from: $scope.self,
        to: $scope.receiver,
        type: "normal",
        position: 'right',
        time : new Date()
    };

    if(msg.content.length === 0) return; // 内容为空

    var rec = $scope.receiver;
    if (rec.tag === "user") { //私信
        if (!$scope.privateMessages[rec.uid]) {
            $scope.privateMessages[rec.uid] = [];
        }
        $scope.privateMessages[rec.uid].push(msg);
    } else { //群聊
        $scope.publicMessages.push(msg);
    }

    $scope.chatContent = "";
    if (rec.uid !== $scope.self.uid) { //排除给自己发的情况
        socket.emit("addMessage", msg);
    }
}       

其实,客户端之间的通信,都是用服务器作为了一个中间媒介,所有的消息发送可以看成是客户端与服务器之间的通信,而这两者之间的通信有很类似TCP协议中的三次握手。

参考博客

总结

这个项目还有挺多没有完善的,比如发送表情,发送图片,登陆用户自己设定用户名与头像等,如果有人感兴趣的话,我可以把大家加为合作者,一起把整个项目完善,甚至做的更好。

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

推荐阅读更多精彩内容