手把手用Node的socket.io撸一个简单聊天室
2017.03.04
hzzly
- Socket.IO用于浏览器与Node.js之间实现实时通信。
- Socket.IO设计的目标是支持任何的浏览器,任何Mobile设备。
- 支持主流的PC浏览器 (IE,Safari,Chrome,Firefox,Opera等),
- Mobile浏览器(iphone Safari/ipad Safari/Android WebKit/WebOS WebKit等)。
- Socket.IO解决了实时的通信问题,并统一了服务端与客户端的编程方式。
- 启动了socket以后,就像建立了一条客户端与服务端的管道,两边可以互通有无。
一、初始化一个Express项目
通过应用生成器工具 express 可以快速创建一个应用的骨架。
1 2 3 4 5 6 7 8 9 10 11 12
| // 全局安装express 脚手架 $ npm install express-generator -g //在当前工作目录创建一个命名为 chat-node 的应用 $ express -e chat-node //安装所有依赖 $ cd chat-node $ npm install //启动这个应用(MacOS 或 Linux 平台): $ npm start
|
然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了
二、安装Socket.IO
这里使用 npm 安装到项目依赖中
1
| $ npm install socket.io --save
|
三、整合Socket.IO到项目中
找到服务开启的www文件
根目录 > bin > www
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| var io = require('socket.io')(server);
var onlineUser = {};
var onlineCount = 0; io.on('connection', (socket) => { console.log('a user connected'); socket.on('disconnect', () => { console.log('user disconnected'); }); socket.on('post', function(say) { io.emit('post', say) }); });
|
通过传递server(HTTP服务器)来初始化socket.io的一个新实例,然后监听连接sockets的connection事件,并将其记录到控制台。
三、修改前台代码
在 views 目录下新建一个index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <title>聊天室</title> </head> <body> <div class="chat" id="chatApp" v-cloak> <ul class="room-list"> <li v-for="item in msgList"> <div class="msg-detail">{{item}}</div> </li> </ul> <div class="send-box"> <input type="text" placeholder="写点什么喃..." v-model="sendMsg"> <button type="button" @click="doSendMsg">发送</button> </div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.3/vue.js"></script> <script src="/javascripts/index.js"></script> </body> </html>
|
我在里面引入了socket.io以及vue(更好的渲染数据)
四、编写业务代码
在 public > javascripts 下新建一个index.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const socket = io(); const vue = new Vue({ el: "#chatApp", data() { return { sendMsg: '', msgList: [] } }, mounted() { socket.on('post', (say) => { this.msgList.push(say) }) }, methods: { doSendMsg() { socket.emit('post', this.sendMsg) this.sendMsg = '' } } })
|
五、在对应路由中打开index.html
在 routes > index.js 修改如下代码
1 2 3 4
| router.get('/', function(req, res, next) { res.sendFile(path.join(__dirname, '../views', 'index.html')); });
|
然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用de效果了
欢迎star
好了,遛了遛了。。。