文档章节

happyChat开发系列:使用websocket.io实现双向通信的乐聊大前端开发

o
 osc_w9s1w4o0
发布于 2019/04/10 09:47
字数 972
阅读 7
收藏 0

精选30+云产品,助力企业轻松上云!>>>

一、前言

乐聊是一个自己用websocket写一个完整的应用,虽然功能比较欠缺,但是实现了基本的文字聊天,以及群聊,私聊,机器人聊天等功能。因为这个自己做了PC端,无线端(手机端),以及使用cordova打包成一个android的apk。实现了一个大前端的项目,虽然现在android端还是有点有问题,在修改bug。

 

二、websocket的原理介绍

1、为什么需要websocket?

因为 HTTP 协议有一个缺陷:通信只能由客户端发起。举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。

轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。

 

2、简介

websocket特点:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

 

其他特点包括:

(1)建立在 TCP 协议之上,服务器端的实现比较容易。

(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

(3)数据格式比较轻量,性能开销小,通信高效。

(4)可以发送文本,也可以发送二进制数据。

(5)没有同源限制,客户端可以与任意服务器通信。

(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

 

三、websocket.io使用

1、前端

在vue项目中,在index.html中

 <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
<script>
      // const socketWeb = io('http://localhost:3000');
      const socketWeb = io('http://chat.chengxinsong.cn');
      const userInfo = JSON.parse(sessionStorage.getItem("HappyChatUserInfo")) if (userInfo) { socketWeb.emit('update', userInfo.user_id); } </script>

 

2、后端

后端是使用koa作为后端

const app = new Koa();


const server = require("http").createServer(app.callback()); const io = require("socket.io")(server);
io.on("connection", socket => {
    const socketId = socket.id;
    /*登录*/
    socket.on("login", async userId => { await socketModel.saveUserSocketId(userId, socketId); }); // 更新soketId socket.on("update", async userId => { await socketModel.saveUserSocketId(userId, socketId); }); //私聊 socket.on("sendPrivateMsg", async data => { const arr = await socketModel.getUserSocketId(data.to_user); const RowDataPacket = arr[0]; const socketid = JSON.parse(JSON.stringify(RowDataPacket)).socketid; io.to(socketid).emit("getPrivateMsg", data); }); // 群聊 socket.on("sendGroupMsg", async data => { io.sockets.emit("getGroupMsg", data); }); //加好友请求 socket.on("sendRequest", async data => { console.log("sendRequest", data); const arr = await socketModel.getUserSocketId(data.to_user); const RowDataPacket = arr[0]; const socketid = JSON.parse(JSON.stringify(RowDataPacket)).socketid; console.log('给谁的socketid',socketid) io.to(socketid).emit("getresponse", data); }); socket.on("disconnect", data => { console.log("disconnect", data); }); });

 

四、简介和功能

乐聊,一个快乐聊天的应用,支持PC端和无线端和安卓APP。

(1)PC端和无线端线上地址:http://chat.chengxinsong.cn

(2)下载安卓APP地址:暂时还有点小问题待解决,后边放出地址

版本v 1.0.0
- 1、支持注册用户和邮件激活用户;
- 2、支持登陆
- 3、支持机器人聊天;
- 4、支持加好友,一对一聊天;
- 5、支持创建群,加群,一对多聊天;
- 6、支持删除好友,退出群
- 7、支持个人信息编辑
- 8、支持添加好友备注
- 9、支持聊天中文字发送
- 10、支持浏览器:Chrome,Firefox,Safari,IE9及以上;

+ 版本v 1.1.0
- 1、支持聊天中图片发送
- 2、支持聊天中表情发送
- 待续

 

五、运行截图

contactrobotpersonalmessagelogin

等等。。。

 

六、前后端源码

前端代码:https://github.com/saucxs/happy-chat-web

后端代码:https://github.com/saucxs/happy-chat-node

 

七、最后

欢迎fork和star,有问题提issue

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

hbase2.1.9 centos7 完全分布式 搭建随记

hbase2.1.9 centos7 完全分布式 搭建随记 这里是当初在三个ECS节点上搭建hadoop+zookeeper+hbase+solr的主要步骤,文章内容未经过润色,请参考的同学搭配其他博客一同使用,并记得根据实际情...

osc_4tfw1dxv
13分钟前
7
0
zookeeper3.5.5 centos7 完全分布式 搭建随记

zookeeper3.5.5 centos7 完全分布式 搭建随记 这里是当初在三个ECS节点上搭建hadoop+zookeeper+hbase+solr的主要步骤,文章内容未经过润色,请参考的同学搭配其他博客一同使用,并记得根据实...

osc_6jhxf9ab
15分钟前
19
0
steam夏日促销悄然开始,用Python爬取排行榜上的游戏打折信息

前言 很多人学习python,不知道从何学起。 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。 很多已经做案例的人,却不知道如何去学习更加高深的知识。 那么针对这三类人,...

osc_ur9mmbck
16分钟前
13
0
python 里 certifi 库的作用

python 里 certifi 库的作用 安装了certifi之后,和requests库一样也有一个cacert.pem,可以用编辑器打开cacert.pem,里面包含了很多可信任知名公司的证书/公钥 库的路径,我这里是python2.7...

osc_1x6ycmfm
17分钟前
11
0
干掉"ZooKeeper",阿里为什么不用ZK做服务发现?

  20大进阶架构专题每日送达   链接:yq.aliyun.com/articles/601745   2020年Java面试题库连载中   !   正文   站在未来的路口,回望历史的迷途,常常会很有意思,因为我们会不...

osc_q5m9dzk0
19分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部