博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现一个简单的WebSocket聊天室
阅读量:6477 次
发布时间:2019-06-23

本文共 2339 字,大约阅读时间需要 7 分钟。

WebSocket 简介

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

为什么传统的HTTP协议不能做到WebSocket实现的功能?这是因为HTTP协议是一个请求-响应协议,请求必须先由浏览器发给服务器,服务器才能响应这个请求,再把数据发送给浏览器。换句话说,浏览器不主动请求,服务器是没法主动发数据给浏览器的。

Web

我们先用 express 搭一个基础的服务端。

创建 index.js 文件

var app = require('express')();var http = require('http').createServer(app);app.get('/', function(req, res){  res.send('

Hello world

');});http.listen(3000, function(){ console.log('listening on *:3000');});复制代码

run node index.js,并在浏览器打开 http://localhost:3000,访问成功即可看到

HTML

设计我们的主页,实现一个简单的聊天窗口。

修改 index.js

app.get('/', function(req, res){  res.sendFile(__dirname + '/index.html');});复制代码

创建 index.html

      Socket.IO chat            
    复制代码

    重启应用并刷新页面你就可以看到一个如下图所示

    Socket.io

    引入socket.io

    npm install --save socket.io

    修改 index.js

    var app = require('express')();var http = require('http').Server(app);var io = require('socket.io')(http);app.get('/', function(req, res){  res.sendFile(__dirname + '/index.html');});io.on('connection', function(socket){  console.log('an user connected');});http.listen(3000, function(){  console.log('listening on *:3000');});复制代码

    修改 index.html,在</body>下添加如下代码

    复制代码

    重启应用并刷新页面,就可以看到命令行打印如下

    Emitting event

    当用户在聊天窗的输入框内输入,并提交时,触发 emit 事件,服务端监听到该事件并做出相应的反应。

    修改 index.html

    复制代码

    服务端监听该事件,在 index.js 文件添加该代码

    io.on('connection', function(socket){  socket.on('chat message', function(msg){    console.log('message: ' + msg);  });});复制代码

    展示消息

    当服务端收到用户A发出的消息,服务端重新发出该消息,让客户端接收,客户端监听到该事件后展示该条消息,就可以实现用户 A, B, C 都接收到该消息。

    修改 index.js

    io.on('connection', function(socket){  socket.on('chat message', function(msg){    io.emit('chat message', msg);  });});复制代码

    修改 index.html,实现消息的展示

    复制代码

    重启应用并刷新页面,可以打开多个浏览器页面同时访问 localhost:3000,就可以体验简单聊天室的效果。

    设置昵称

    在每个用户进入的时候,随机生成一个数字作为用户的昵称,并且向所有用户广播该用户进入聊天室。当用户发送消息时,拼接上用户的昵称。

    修改 index.js

    io.on('connection', (socket) => {  const nickname = 'user' + Math.ceil((Math.random() * 1000))  socket.broadcast.emit('connection', nickname + ' connected')  socket.on('chat message', (msg) => {    io.emit('chat message', nickname + ': ' + msg)  })})复制代码

    修改 index.html,监听 connection 事件

    复制代码

    重启应用并打开多个客户端,可以看到如下效果

    参考资料

    本文大部分案例出自 socket.io 的入门文档

    转载地址:http://svqko.baihongyu.com/

    你可能感兴趣的文章
    copy strong weak assign的区别
    查看>>
    OpenCV 入门
    查看>>
    css 3D transform变换
    查看>>
    ele表格合并行之后的selection选中
    查看>>
    正则表达式分解剖析(一文悟透正则表达式)
    查看>>
    解决UILable标点符号居中的问题
    查看>>
    HTML5新特性教程
    查看>>
    SpringBoot 实战 (十七) | 整合 WebSocket 实现聊天室
    查看>>
    ImageOptim-无损图片压缩Mac版
    查看>>
    12 Go语言map底层浅析
    查看>>
    vue-resumer 项目中 element-ui 遇到的 textarea autosize 问题
    查看>>
    以主干开发作为持续交付的基础
    查看>>
    PHP扩展库PEAR被攻击,近半年下载者或被影响
    查看>>
    传统运维团队转型应该注意哪些问题?
    查看>>
    JavaScript函数(二)
    查看>>
    Airbnb改进部署管道安全性,规范部署顺序
    查看>>
    腾讯最大规模裁撤中层干部,让贤年轻人
    查看>>
    当我们谈性能的时候,我们实际上在谈什么?
    查看>>
    蔡超:入门 Go 语言必须跨越的五个思维误区
    查看>>
    使用Akka Actor和Java 8构建反应式应用
    查看>>