本文章主要介绍如何实现一个基本的聊天,后续会添加表情包,传照片等功能
其实刚开始接触的时候,我最大的疑惑是聊天功能的前期是否需要搭建什么框架、下载一些什么东西之类的,结果就是,其实websocket可以直接使用,然后前后端搭配,也是免费的,暂时没发现需要收费功能的东西。
实现效果图:

首先封装一个websocket.js文件(大家可以直接复制,然后把接收/发送数据之类的格式改成自己的就可以啦)
- import store from '@/store'
- var webSocket = null;
- var globalCallback = null;//定义外部接收数据的回调函数
-
- //初始化websocket
- export function initWebSocket (url) {
- //判断浏览器是否支持websocket
- if ("WebSocket" in window) {
- webSocket = new WebSocket(url);//创建socket对象
- } else {
- alert("该浏览器不支持websocket!");
- }
- //打开
- webSocket.onopen = function () {
- webSocketOpen();
- };
- //收信
- webSocket.onmessage = function (msg) {
- webSocketOnMessage(msg);
- };
- //关闭
- webSocket.onclose = function () {
- webSocketClose();
- };
- //连接发生错误的回调方法
- webSocket.onerror = function () {
- console.log("WebSocket连接发生错误");
- };
- }
-
- //连接socket建立时触发
- export function webSocketOpen () {
- console.log("WebSocket连接成功");
- }
-
- //客户端接收服务端数据时触发,e为接受的数据对象
- export function webSocketOnMessage (e) {
- // 存储在store中,然后在聊天界面中监控变化 自动拿取收到的信息
- store.commit('user/SET_WS_MSG', e)
- }
-
- //发送数据
- export function webSocketSend (data) {
- console.log('发送数据');
- //在这里根据自己的需要转换数据格式
- webSocket.send(JSON.stringify(data));
- }
-
- //关闭socket
- export function webSocketClose () {
- webSocket.close()
- console.log("对话连接已关闭");
- // }
- }
-
-
- //在其他需要socket地方调用的函数,用来发送数据及接受数据
- export function sendSock (agentData, callback) {
- globalCallback = callback;//此callback为在其他地方调用时定义的接收socket数据的函数,此关重要。
- //下面的判断主要是考虑到socket连接可能中断或者其他的因素,可以重新发送此条消息。
- switch (webSocket.readyState) {
- //CONNECTING:值为0,表示正在连接。
- case webSocket.CONNECTING:
- setTimeout(function () {
- console.log('正在连接。。。');
- webSocketSend(agentData, callback);
- }, 1000);
- break;
- //OPEN:值为1,表示连接成功,可以通信了。
- case webSocket.OPEN:
- console.log('连接成功');
- webSocketSend(agentData);
- break;
- //CLOSING:值为2,表示连接正在关闭。
- case webSocket.CLOSING:
- setTimeout(function () {
- console.log('连接关闭中');
- webSocketSend(agentData, callback);
- }, 1000);
- break;
- //CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
- case webSocket.CLOSED:
- console.log('连接关闭/打开失败');
- // do something
- break;
- default:
- // this never happens
- break;
- }
- }
-
- //将初始化socket函数、发送(接收)数据的函数、关闭连接的函数export出去
- export default {
- initWebSocket,
- webSocketClose,
- sendSock
- };
在vuex中定义存储下接收的数据
store/modules/user.js
- let state = {
- webSocketMsg: ''
- };
-
- //修改state
- const mutations = {
- // 存储websocket推送的消息
- SET_WS_MSG: (state, msg) => {
- state.webSocketMsg = msg
- }
- }
- //提交异动mutations。 如果在接受块出现问题,可以把这个加上去看看
- //const actions = {
- // webSockets ({ commit }) {
- // commit('SET_WS_MSG', 2)
- // }
- //}
store/getters.js
- //获取state的状态
- const getters = {
- webSocketMsg: state => state.user.webSocketMsg
- }
-
- export default getters
然后在聊天界面中开始使用啦 websocket.vue
- <script>
- import { initWebSocket, sendSock, webSocketClose } from '@/utils/websocket.js'
- export default {
- data() {
- return {
- // 这个地址是后端给的,用来连接websocket。 加密wss 未加密ws
- wsUrl:'ws://地址',
- }
- },
- // 从store中获取接收到的信息
- computed: {
- getSocketMsg() {
- return this.$store.state.user.webSocketMsg
- },
- },
- //监控 getSocketMsg 是否有接收到数据
- watch: {
- getSocketMsg: {
- handler: function (val) {
- this.getConfigResult(val)
- },
- },
- //这一步是我对我聊天框的css设计,大家可以不用写,需要的时候再参考。
- //我将接收到的信息和发出的信息都存储到obList中,然后通过监控数值变化,使聊天定位始终位于底部(css中 overflow: auto;)
- obList: {
- handler: function (val) {
- this.$nextTick(() => {
- this.$refs.chatContent.scrollTop = this.$refs.chatContent.scrollHeight
- })
- },
- },
- immediate: true,
- },
- methods: {
- // 点击按钮-建立聊天连接
- customerDialog() {
- initWebSocket(this.wsUrl)
- },
- // 接收socket回调函数返回数据的方法,这个函数是我在监控接受数据的时候调用的(上面的watch中)
- getConfigResult(val) { },
-
- // 点击发送按钮 发送信息---发送信息的格式要和后端确认
- sending() {
- sendSock('发送的信息')
- },
- // 处理聊天框关闭事件
- handleClose() {
- //关闭连接
- webSocketClose()
- },
- },
- }
- </script>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。