happyChat开发系列:使用websocket.io实现双向通信的乐聊大前端开发
一、前言
乐聊是一个自己用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、支持聊天中表情发送
- 待续
五、运行截图





等等。。。
六、前后端源码
前端代码:https://github.com/saucxs/happy-chat-web
后端代码:https://github.com/saucxs/happy-chat-node
七、最后
欢迎fork和star,有问题提issue
happyChat开发系列:使用websocket.io实现双向通信的乐聊大前端开发的更多相关文章
- 【多端应用开发系列0.0.0——之总序】xy多端应用开发方案定制
[目录] 0.0.0 [多端应用开发系列之总序]服务器Json数据处理——Json数据概述 0.0.0 [因] 正在学习多客户端应用开发,挖个坑,把所用到的技术方案,用最简单直白的语言描述出来,写成一 ...
- 从零开始搭建Java开发环境第四篇:精选IDEA中十大提高开发效率的插件!
Lombok 知名的插件,无需再写那么多冗余的get/set代码 JRebel 热部署插件 alibaba java coding guide 阿里巴巴代码规范插件,自动检查代码规范问题 [在这里插入 ...
- Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十九】
<Web 前端开发精华文章推荐>2013年第七期(总第十九期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...
- 《C#微信开发系列(4)-接收 / 返回文本消息》
4.0接收 / 返回文本消息 ①接收/返回文本消息原理说明 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,着手开发之前先行阅读微信公众平台接收普通消息 ...
- 《C#微信开发系列(Top)-微信开发完整学习路线》
年前就答应要将微信开发的学习路线整理给到大家,但是因为年后回来这段时间学校还有公司那边有很多事情需要兼顾,所以没能及时更新文章.今天特地花时间整理了下,话不多说,上图,希望对大家的学习有所帮助哈. 如 ...
- Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】
2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...
- 《C#微信开发系列(3)-获取接口调用凭据》
3.0获取接口调用凭据 ①接口说明 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留 ...
- 《C#微信开发系列(2)-自定义菜单管理》
2.0自定义菜单管理 ①接口说明 微信服务号聊天窗口下面的菜单项(有的公众号有启用有的则没有),这个可以在编辑模式简单配置,也可以在开发模式代码配置.微信公众平台开发者文档:微信公众号开发平台创建自定 ...
- 《C#微信开发系列(1)-启用开发者模式》
1.0启用开发者模式 ①填写服务器配置 启用开发模式需要先成为开发者,而且编辑模式和开发模式只能选择一个(进入微信公众平台=>开发=>基本配置)就可以看到以下的界面: 点击修改配置,会出现 ...
随机推荐
- [Micropython]TPYBoard v10x NRF24L01无线通讯模块使用教程
1.实验目的: • 学习使用NRF24L01无线通讯模块 2.所需原器件: • TPYBoard v10X开发板两块 • NRF24L01无线通讯模块两个 • ...
- [Micropython]TPYBoard v10x MFRC522智能门禁系统
MF RC522 是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员.也就是射频卡. 经常忘带钥匙,最尴尬的上周竟然去开4楼的门,(家住五楼,无电梯),开了好一会没打开,事后对4楼 ...
- js判断是否下拉刷新
if(document.body.scrollTop + window.innerHeight>=document.body.clientHeight-10){ this.loadPointsL ...
- Java基础:Java虚拟机(JVM)
当我们第一次学习Java时这些原理上的东西就会被提到,但是很少有真正去学习.今天开始从头过一遍Java,打算从JVM开始. 1. JVM是什么 2. JRE和JDK 3. JVM结构 3.1. 程序计 ...
- lambda隐藏函数的嵌套
# 隐藏函数嵌套 f = (lambda a,b :a if a>b else b)(1000, 2000008) print((lambda a,g:a if a > g else g) ...
- ThreadPoolExecutor 学习笔记
线程池的奥义 在开发程序的过程中,很多时候我们会遇到遇到批量执行任务的场景,当各个具体任务之间互相独立并不依赖其他任务的时候,我们会考虑使用并发的方式,将各个任务分散到不同的线程中进行执行来提高任务的 ...
- java多线程对CountDownLatch的使用实例
介绍 CountDownLatch是一个同步辅助类,它允许一个或多个线程一直等待直到其他线程执行完毕才开始执行. 用给定的计数初始化CountDownLatch,其含义是要被等待执行完的线程个数. 每 ...
- 节流throttle和防抖debounce
underscore.js提供了很多很有用的函数,今天想说说其中的两个.这两个函数都用于限制函数的执行. debounce 在解释这个函数前,我们先从一个例子看下这个函数的使用场景.假设我们网站有个搜 ...
- python 模块与包
一.模块 1.1 什么是模块 # 什么是模块 # 一组功能的集合,就是模块,在python中一个py文件就一个模块 1.2 为什么要使用模块 # 1.可使代码的结构功能分区更清晰 # 2.可重复使用模 ...
- 五种开源协议(GPL,LGPL,BSD,MIT,Apache)介绍
商业化的软件应该主要选用MIT或者Apache license的开源系统作为插件. 什么是许可协议? 什么是许可,当你为你的产品签发许可,你是在出让自己的权利,不过,你仍然拥有版权和专利(如果申请了的 ...