最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue + socket.io實現(xiàn)一個簡易聊天室示例代碼

 更新時間:2017年03月06日 08:32:19   作者:小龍女先生  
本篇文章主要介紹了vue + socket.io實現(xiàn)一個簡易聊天室示例代碼,具有一定的參考價值,有興趣的可以了解一下。

vue + vuex + elementUi + socket.io實現(xiàn)一個簡易的在線聊天室,提高自己在對vue系列在項目中應(yīng)用的深度。因為學(xué)會一個庫或者框架容易,但要結(jié)合項目使用一個庫或框架就不是那么容易了。功能雖然不多,但還是有收獲。設(shè)計和實現(xiàn)思路較為拙劣,懇請各位道友指正。

可以達到的需求

  • 能查看在線用戶列表
  • 能發(fā)送和接受消息

使用到的框架和庫

  • socket.io做為實時通訊基礎(chǔ)
  • vuex/vue:客戶端Ui層使用
  • Element-ui:客戶端Ui組件

類文件關(guān)系圖

服務(wù)端:

客戶端:

服務(wù)端實現(xiàn)

實現(xiàn)聊天服務(wù)器的相關(guān)功能,包含通訊管道的創(chuàng)建、用戶加入、消息的接受與轉(zhuǎn)發(fā)等。

一、通訊服務(wù)建立

build/server-config.js:聊天服務(wù)器的入口

let socketIo = require('socket.io');
let express = require('express'); 
let cxt = require('../src/services-server');

let httpPort = 9001;
let channelId = 1
let app = express();

app.get('/',function(req,res){
  res.send('啟動成功:' + httpPort);
});
 
let server = require('http').createServer(app);
let io = socketIo(server);
io.on('connection',function(socket){ 
  console.log('有客戶端連接');
  cxt.createChannel(channelId++,socket)
});
server.listen(httpPort); //用server連接
console.log('io listen success !! ' + httpPort);

  • 通過express創(chuàng)建一個server對象,然后利用socketIo創(chuàng)建io對象
  • 然后通過io的on方法監(jiān)聽connection事件
  • 當(dāng)有客戶端連接時,觸發(fā)connection事件,縣立即調(diào)用"服務(wù)端上下文(后面簡稱cxt)"的createChannel方法創(chuàng)建一個管道,此時的管道上是沒有用戶信息的。

二、創(chuàng)建上下文(服務(wù)端上下文)

實現(xiàn)一個聊天室上下文,包含:用戶、房間、消息、管道等數(shù)組,所以代碼都在service-server目錄中。

  • index.js:聊天室服務(wù)端上下文創(chuàng)建入口,創(chuàng)建context,并初始化房間到上下文中。
  • context.js:聊天室服務(wù)端上下文類,用戶、房間、消息、管道等類在此中做集中管理。
  • room目錄:包含房間和房間集合的實現(xiàn)
  • channel:服務(wù)端與客戶端通訊的管道類

結(jié)合"通訊服務(wù)建立"中的connectiong事件的觸,其后轉(zhuǎn)到cxt.createChannel方法

createChannel (id, socket) {
  let channel = new Channel(id, socket, this)
  channel.init()
  channel.index = this.channels.length
  this.channels.push(channel)
}

此時會創(chuàng)建一個管道實例,然后初始化管道實例,并將管道添加到管道數(shù)組中。以下是初始化管道實例的代碼:

init () {
  let self = this
  let roomInfo = this.cxt.room.collections[0]
  this.roomInfo = roomInfo
  this.socket.join('roomId' + roomInfo.id)
  this.socket.emit(this.cxt.eventKeys.emit.sendRooms, roomInfo) /* send出去一個默認(rèn)的房間 */
  this.socket.on(this.cxt.eventKeys.client.registerUser, function (id, name) {
   console.log(id + '-' + name + '--' + self.id)
   self.cxt.createUserById(id, name, self.id)
  }) /** 新用戶注冊 */
  this.socket.on(this.cxt.eventKeys.client.newMsg, function (msg) { /** 發(fā)送消息 */
   self.notifyMsg(msg)
   console.log(msg)
   self.cxt.addMsg(msg)
  })
  this.socket.on(this.cxt.eventKeys.client.closeConn, function () {
   console.log(self.id + '--關(guān)閉連接')
   self.cxt.remove(self)
  })
  this.sendUsers()
}

在初始化管道實例時做了如下事件:

  • 將通訊socket添加一個到房間中,方便后期好廣播消息
  • 向當(dāng)前連接上來的socket發(fā)送房間信息,設(shè)定為第一個房間
  • 監(jiān)聽三個事件:用戶注冊、新消息、關(guān)閉連接。此處都要邏輯處理,可以參考源碼。

客戶端實現(xiàn)

主要實現(xiàn)連接服務(wù)、注冊用戶、發(fā)送和接受消息的功能。首先以main.js為入口,且需要先裝配好vue相關(guān)配件,如vuex、ElemUi、客戶端通訊管道等,然后創(chuàng)建vue實例和連接消息服務(wù)器,代碼如下:

import '../node_modules/bootstrap/dist/css/bootstrap.css'
import Vue from 'vue'
import ElemUi from 'element-ui'
import 'element-ui/lib/theme-default/index.css'
import App from './App'
import * as stores from './store'
import { Keys } from './uitls'
import { getCxt } from './services-client'

let initRoomInfo = Keys.SETROOMINFO
Vue.use(ElemUi)
/* eslint-disable no-new */
new Vue({
 store: stores.default,
 el: '#app',
 template: '<App/>',
 components: { App },
 created: function () {
  let self = this
  getCxt().createIo(this, function (roomInfo) {
   stores.busCxt.init() /** 初始化view與service層的交互層(業(yè)務(wù)層) */
   self.$store.dispatch(initRoomInfo, roomInfo)
   getCxt().refUsers(function (users) {
    stores.busCxt.userCxt.refUsers(users)
   })
  })
 }
})



一、與服務(wù)端的通訊

service-client目錄中實例的與消息服務(wù)器通訊,其中包含創(chuàng)建用戶、接受和發(fā)送消息等。一個客戶端只能擁有一個消息管道,以下代碼是消息管理的創(chuàng)建:

import * as io from 'socket.io-client'
import Context from './context'

let eventKeys = require('../services-uitls/event.keys')
let url = 'http://localhost:9001/'
let cxt = null

export function getCxt () {
 if (cxt == null) {
  cxt = new Context(url, eventKeys, io)
 }
 return cxt
}

在main.js中的vue實例的created勾子中調(diào)用了Context的createIo實例方法,用于創(chuàng)建一個與消息服務(wù)器的連接,并接受其中房間發(fā)送回來的房間信息。然后就初始化業(yè)務(wù)層。

二、vuex的結(jié)合

在store目錄中實現(xiàn),包含了vuex類相關(guān)的實現(xiàn),還有業(yè)務(wù)層的實現(xiàn)。其中業(yè)務(wù)層會引用"客戶端通訊管道",而vuex實現(xiàn)類有可能會引用業(yè)務(wù)層相關(guān)實現(xiàn)類,以此實現(xiàn)ui到"消息服務(wù)器"的通訊。 store/index.js代碼如下:

import Vuex from 'vuex'
import Vue from 'vue'

import RoomViewCxt from './room/roomViewCxt'
import UserViexCxt from './userViewCxt'
import MsgViewCxt from './msg/msgViewCxt'
import BusCxt from './indexForBus'

let _busCxt = new BusCxt()

let _rvCxt = new RoomViewCxt()
let _uvCxt = new UserViexCxt(_busCxt.userCxt)
let _mvCxt = new MsgViewCxt()

let opt = {
 state: null,
 getters: null,
 mutations: null,
 actions: null
}
_rvCxt.use(opt)
_uvCxt.use(opt)
_mvCxt.use(opt)

Vue.use(Vuex)

let store = new Vuex.Store(opt)
export default store
export const busCxt = _busCxt /** 業(yè)務(wù)處理上下文 */
export function getBusCxt () {
 return _busCxt
}

三、組件

組件只實現(xiàn)了 用戶注冊、主界面容器、消息發(fā)送和消息接受等。組件只會引用store目錄中相關(guān)類,不會直接引用管道類。

  • Login.vue:用戶注冊組件
  • HChat.vue:主界面容器組件
  • Message/MsgWriter.vue:發(fā)送消息組件
  • Message/MsgList.vue:接受和顯示消息列表組件

如何運行實例

  • cnpm run install 安裝所有的依賴
  • npm run sokcetIo 啟動消息服務(wù)器
  • npm run dev 啟動客戶端

示例截圖

下載地址:vue-Socket_jb51.rar

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue.js中數(shù)據(jù)綁定的語法教程

    Vue.js中數(shù)據(jù)綁定的語法教程

    Vue框架很核心的功能就是雙向的數(shù)據(jù)綁定。下面這篇文章主要給大家介紹了關(guān)于Vue.js中數(shù)據(jù)綁定的語法教程,文中通過示例代碼介紹的非常詳細,相信對大家具有一的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • 深入探究Vue中$nextTick的實現(xiàn)原理

    深入探究Vue中$nextTick的實現(xiàn)原理

    這篇文章主要為大家詳細介紹Vue中$nextTick的實現(xiàn)原理,文中的示例代碼講解詳細,對我們深入了解Vue有一定的幫助,需要的小伙伴可以參考一下
    2023-06-06
  • Vue頁面加載完成后如何自動加載自定義函數(shù)

    Vue頁面加載完成后如何自動加載自定義函數(shù)

    這篇文章主要介紹了Vue頁面加載完成后如何自動加載自定義函數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Vue3項目剛創(chuàng)建就報錯的問題及解決

    Vue3項目剛創(chuàng)建就報錯的問題及解決

    這篇文章主要介紹了Vue3項目剛創(chuàng)建就報錯的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 解決vue中使用proxy配置不同端口和ip接口問題

    解決vue中使用proxy配置不同端口和ip接口問題

    這篇文章主要介紹了解決vue中使用proxy配置不同端口和ip接口問題 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • vue?遮罩和ref的使用setup版和非setup版

    vue?遮罩和ref的使用setup版和非setup版

    這篇文章主要介紹了vue?遮罩和ref的使用,setup版和非setup版,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • 一文解析Vue h函數(shù)到底是個啥

    一文解析Vue h函數(shù)到底是個啥

    h()函數(shù)是Vue.js中的一個工具函數(shù),用于創(chuàng)建虛擬DOM節(jié)點,具有更高的靈活性和控制力,本文介紹Vue h函數(shù)到底是個啥,感興趣的朋友一起看看吧
    2025-02-02
  • spring-cloud-stream的手動消息確認(rèn)問題

    spring-cloud-stream的手動消息確認(rèn)問題

    這篇文章主要介紹了spring-cloud-stream的手動消息確認(rèn)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • VuePress在build打包時window?document?is?not?defined問題解決

    VuePress在build打包時window?document?is?not?defined問題解決

    這篇文章主要為大家介紹了VuePress在build打包時window?document?is?not?defined問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Vue3配置vite.config.js解決跨域問題的方法

    Vue3配置vite.config.js解決跨域問題的方法

    跨域一般出現(xiàn)在開發(fā)階段,由于線上環(huán)境前端代碼被打包成了靜態(tài)資源,因而不會出現(xiàn)跨域問題,這篇文章主要給大家介紹了關(guān)于Vue3配置vite.config.js解決跨域問題的相關(guān)資料,需要的朋友可以參考下
    2024-07-07

最新評論

阿拉尔市| 花莲县| 新巴尔虎右旗| 成武县| 广宗县| 华蓥市| 大竹县| 青海省| 忻城县| 公主岭市| 怀化市| 花莲县| 邹平县| 信宜市| 东乌珠穆沁旗| 达拉特旗| 舒兰市| 昆明市| 双柏县| 仪陇县| 波密县| 临夏市| 天台县| 湖南省| 夏津县| 大冶市| 加查县| 集贤县| 长垣县| 临城县| 会昌县| 民乐县| 太谷县| 泰和县| 崇明县| 修文县| 沙田区| 宁德市| 荆门市| 义马市| 汶川县|