简介:本文通过完整代码示例,详细讲解vue-socket.io与egg-socket.io的集成方法,涵盖前后端配置、事件监听与触发、连接管理等核心功能,帮助开发者快速构建实时应用。
在构建需要实时数据更新的应用时(如聊天系统、实时监控、协作编辑等),WebSocket技术凭借其全双工通信特性成为首选方案。相比传统HTTP轮询,WebSocket可显著降低服务器负载和响应延迟。本文介绍的vue-socket.io与egg-socket.io组合,为Vue前端与Egg.js后端提供了标准化的实时通信解决方案。
# 创建Vue项目(如已存在可跳过)vue create realtime-democd realtime-demo# 安装vue-socket.ionpm install vue-socket.io socket.io-client --save
# 创建Egg项目mkdir egg-socket-server && cd egg-socket-servernpm init egg --type=simplenpm install egg-socket.io --save
在config/plugin.js中启用插件:
exports.io = {enable: true,package: 'egg-socket.io',};
配置WebSocket连接参数(config/config.default.js):
exports.io = {init: { }, // 传递给Socket.IO的配置namespace: {'/': {connectionMiddleware: [],packetMiddleware: [],},},};
创建app/io/controller/nsp.js:
const Controller = require('egg').Controller;class ChatController extends Controller {async ping() {const { ctx, app } = this;const message = ctx.args[0];// 广播给所有客户端app.io.emit('pong', `Server response to: ${message}`);}async joinRoom() {const { ctx, app } = this;const { room } = ctx.args[0];ctx.socket.join(room);ctx.socket.emit('joined', `Joined room ${room}`);}}module.exports = ChatController;
在app/io/middleware/logger.js中添加中间件:
module.exports = app => {return async (ctx, next) => {console.log(`Socket connected: ${ctx.socket.id}`);await next();};};
配置app/io/controller路由(app/router.js):
module.exports = app => {app.io.route('ping', app.io.controller.nsp.ping);app.io.route('joinRoom', app.io.controller.nsp.joinRoom);};
创建src/socket.js:
import Vue from 'vue';import VueSocketIO from 'vue-socket.io';import SocketIO from 'socket.io-client';const options = {transports: ['websocket'],autoConnect: false // 手动控制连接};Vue.use(new VueSocketIO({debug: true,connection: SocketIO('http://localhost:7001', options),vuex: {store,actionPrefix: 'SOCKET_',mutationPrefix: 'SOCKET_'}}));
在Vue组件中:
export default {sockets: {connect() {console.log('WebSocket connected');},pong(data) {this.$notify({ title: 'Server Response', message: data });},disconnect() {console.log('Disconnected');}},methods: {sendMessage() {this.$socket.emit('ping', 'Hello from client');},joinRoom() {this.$socket.emit('joinRoom', { room: 'room1' });}}}
结合Vuex使用(store/modules/socket.js):
const state = {messages: [],onlineUsers: 0};const mutations = {SOCKET_NEW_MESSAGE(state, message) {state.messages.push(message);},SOCKET_USER_COUNT(state, count) {state.onlineUsers = count;}};export default { namespaced: true, state, mutations };
服务端房间操作示例:
// 加入房间app.io.of('/').adapter.on('join-room', (room, id) => {console.log(`Client ${id} joined room ${room}`);});// 发送房间消息ctx.socket.to('room1').emit('room-update', { data: 'Room specific message' });
客户端房间监听:
this.$socket.on('room-update', (data) => {if (this.currentRoom === 'room1') {// 处理房间消息}});
配置自动重连策略:
// 客户端配置const socket = new SocketIO('http://localhost:7001', {reconnection: true,reconnectionAttempts: 5,reconnectionDelay: 1000,timeout: 5000});// 服务端错误处理app.io.on('error', err => {app.logger.error('Socket error:', err);});
Nginx反向代理配置示例:
location /socket.io/ {proxy_pass http://localhost:7001;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;}
关键监控项:
推荐监控工具:
服务端配置CORS:
// config/config.default.jsexports.io = {cors: {origin: '*',methods: ['GET', 'POST']}};
realtime-demo/├── client/ # Vue前端│ ├── src/│ │ ├── sockets/ # Socket.IO配置│ │ └── views/ # 页面组件├── server/ # Egg.js后端│ ├── app/│ │ ├── io/ # Socket.IO控制器│ │ └── public/ # 静态资源└── docker-compose.yml # 容器化部署
通过本文的完整示例,开发者可以快速掌握vue-socket.io与egg-socket.io的集成方法。实际开发中,建议结合具体业务场景进行架构设计,特别注意连接管理和错误处理机制的实现。对于高并发场景,可考虑引入Redis适配器实现多实例消息同步。