用uniapp 及socket.io做一个简单聊天app 2

avatar
作者
猴君
阅读量:0

在这里只有群聊,二个好友聊天,可以认为是建了一个二人的群聊。

const express = require('express'); const http = require('http'); const socketIo = require('socket.io'); const cors = require('cors'); // 引入 cors 中间件  const app = express(); const server = http.createServer(app); const io = socketIo(server, {   cors: {     origin: "*", // 允许所有来源     methods: ["GET", "POST"]   } });  // 使用 cors 中间件 app.use(cors());  const port = 3000; const groups = {};  io.on('connection', (socket) => {   console.log('New user connected');    // 用户加入群组   socket.on('joinGroup', ({ groupName, userName }) => {     socket.join(groupName);     groups[socket.id] = { groupName, userName };     socket.to(groupName).emit('message', `${userName} has joined the group`);     console.log(`${userName} joined group ${groupName}`);   });    // 发送消息   socket.on('sendMessage', ({ groupName, message, userName }) => {     io.to(groupName).emit('message', `${userName}: ${message}`);     console.log(`Message sent to ${groupName}: ${userName}: ${message}`);   });    // 踢人   socket.on('kickUser', ({ groupName, userName }) => {     for (let id in groups) {       if (groups[id].userName === userName && groups[id].groupName === groupName) {         io.sockets.sockets.get(id).leave(groupName);         io.to(groupName).emit('message', `${userName} has been kicked from the group`);         console.log(`${userName} was kicked from group ${groupName}`);         break;       }     }   });    // 用户断开连接   socket.on('disconnect', () => {     if (groups[socket.id]) {       const { groupName, userName } = groups[socket.id];       socket.to(groupName).emit('message', `${userName} has left the group`);       delete groups[socket.id];       console.log(`${userName} left group ${groupName}`);     }   }); });  server.listen(port, () => {   console.log(`Server running on port ${port}`); });   

uniapp的界面

<template>   <view class="container">     <view>       <input v-model="userName" placeholder="用户名"/>       <input v-model="groupName" placeholder="群名"/>       <button @click="joinGroup">加入群</button>       <button @click="kickUser">踢人</button>     </view>     <view>       <view id="messages">         <view v-for="(msg, index) in messages" :key="index">{{ msg }}</view>       </view>       <input v-model="message" placeholder="输入聊天"/>       <button @click="sendMessage">聊天</button>     </view>   </view> </template>  <script> import io from 'socket.io-client';  export default {   data() {     return {       socket: null,       userName: 'wanghaibin',       groupName: 'wanghaibin',       message: '',       messages: []     };   },   onLoad() {     this.socket = io('http://127.0.0.1:3000');     this.socket.on('message', (msg) => {       this.messages.push(msg);     });   },   methods: {     joinGroup() {       this.socket.emit('joinGroup', { groupName: this.groupName, userName: this.userName });     },     sendMessage() {       if (this.message.trim() !== '') {         this.socket.emit('sendMessage', { groupName: this.groupName, message: this.message, userName: this.userName });         this.message = '';       }     },     kickUser() {       const userNameToKick = prompt('Enter the username to kick:');       this.socket.emit('kickUser', { groupName: this.groupName, userName: userNameToKick });     }   } }; </script>  <style> .container {   padding: 20px; } #messages {   height: 300px;   overflow-y: scroll;   border: 1px solid #ccc;   margin-bottom: 10px; } input {   display: block;   margin: 10px 0; } button {   display: block;   margin: 10px 0; } </style>   

运行效果:在这里插入图片描述

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!