前端项目中使用websocket来实现即时通讯-以聊天室为例

介绍

websocket可以在用户的浏览器和服务器之间打开交互式通信会话,使用websocket可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应。

本文通过构建一个简易的websocket聊天室,简单介绍如何使用websocket在服务端和浏览器端进行通信。

首先介绍一下前端websocket一些基本接口。

Websocket API

  • 实例化
let socket = new Websocket(url[, protocols])
// 实例化直接建立连接,连接完成可以开始通讯了
  • 发送消息
socket.send(msg)
  • 关闭
socket.close()

Websocket 回调函数

  • onopen
    连接建立成功触发,可以开始通讯了。
  • onmessage(event)
    接收消息函数,服务器返回的数据在event.data中,接收到的数据是字符串的格式。
  • onclose
    socket关闭时被调用。
    -onerror
    用于指定连接失败后的回调函数。
    指定回调函数的示例:
socket.onmessage = (event) => {
   
  console.log(event.data)
}

Websocket 状态码

实例化后,socket的可能的状态码可以通过访问socket对象的常量属性获得。
可能的状态码:

- socket.CONNECTING - 0 # 正在链接,实例化至此时onopen触发之间
- socket.OPEN - 1	# 触发onopen,之后一直保持该状态直到断开连接
- socket.CLOSING - 2 # 关闭连接挥手阶段 
- socket.CLOSED - 3 # 连接已关闭或者连接未建立。 当服务器关闭或者调用close断开连接并且挥手结束后

socket当前的状态码可以通过readyState属性进行访问:

if (socket.readyState == socket.OPEN) {
    // 判断是否在正常连接状态
  xxx
} 

Websockt聊天室实现

只是一个非常简易的demo,效果图如下:
在这里插入图片描述
github地址:

前端

前端需要主动建立连接,同时实现收发消息功能。
1.我们封装一个websocket类,对类进行实例化就创建了一个socket连接:
文件路径:src/socket/socket.js

class CWebSocket {
   
  constructor (url) {
   
    this.socket = new Websocket(url)
  }
}
  1. 发消息函数
  • 因为收发的消息是字符串格式,所以需要用JSON.stringify转为字符串。
  • 实例化后就可能会调用发送消息,但是此时连接可能未建立完成,所以用一个待发送消息列表将未发送的消息保存下来,等连接成功后发送。
class CWebSocket {
   
  constructor (url) {
   
    this.socket = new Websocket(url)
  	this.waitingList = []
  	this.socket.open = (...args) => {
   
  		this.checkWaitingList()
  	}
  }
  checkWaitingList () {
   
  	this.waitingList.forEach(this.C2SMessage)
  },
  C2SMessage (data) {
   
  	if (this.socket.readyState !== this.socket.OPEN) {
   
  		this.waitingList.push
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值