vue實現websocket客服聊天功能

本文章主要介紹如何實現一個基本的聊天,後續會添加表情包,傳照片等功能

其實剛開始接觸的時候,我最大的疑惑是聊天功能的前期是否需要搭建什麼框架、下載一些什麼東西之類的,結果就是,其實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>

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: