ToB企服应用市场:ToB评测及商务社交产业平台

标题: 用uniapp 及socket.io做一个简单谈天app 2 [打印本页]

作者: 莱莱    时间: 2024-7-29 11:37
标题: 用uniapp 及socket.io做一个简单谈天app 2
在这里只有群聊,二个挚友谈天,可以以为是建了一个二人的群聊。
  1. const express = require('express');
  2. const http = require('http');
  3. const socketIo = require('socket.io');
  4. const cors = require('cors'); // 引入 cors 中间件
  5. const app = express();
  6. const server = http.createServer(app);
  7. const io = socketIo(server, {
  8.   cors: {
  9.     origin: "*", // 允许所有来源
  10.     methods: ["GET", "POST"]
  11.   }
  12. });
  13. // 使用 cors 中间件
  14. app.use(cors());
  15. const port = 3000;
  16. const groups = {};
  17. io.on('connection', (socket) => {
  18.   console.log('New user connected');
  19.   // 用户加入群组
  20.   socket.on('joinGroup', ({ groupName, userName }) => {
  21.     socket.join(groupName);
  22.     groups[socket.id] = { groupName, userName };
  23.     socket.to(groupName).emit('message', `${userName} has joined the group`);
  24.     console.log(`${userName} joined group ${groupName}`);
  25.   });
  26.   // 发送消息
  27.   socket.on('sendMessage', ({ groupName, message, userName }) => {
  28.     io.to(groupName).emit('message', `${userName}: ${message}`);
  29.     console.log(`Message sent to ${groupName}: ${userName}: ${message}`);
  30.   });
  31.   // 踢人
  32.   socket.on('kickUser', ({ groupName, userName }) => {
  33.     for (let id in groups) {
  34.       if (groups[id].userName === userName && groups[id].groupName === groupName) {
  35.         io.sockets.sockets.get(id).leave(groupName);
  36.         io.to(groupName).emit('message', `${userName} has been kicked from the group`);
  37.         console.log(`${userName} was kicked from group ${groupName}`);
  38.         break;
  39.       }
  40.     }
  41.   });
  42.   // 用户断开连接
  43.   socket.on('disconnect', () => {
  44.     if (groups[socket.id]) {
  45.       const { groupName, userName } = groups[socket.id];
  46.       socket.to(groupName).emit('message', `${userName} has left the group`);
  47.       delete groups[socket.id];
  48.       console.log(`${userName} left group ${groupName}`);
  49.     }
  50.   });
  51. });
  52. server.listen(port, () => {
  53.   console.log(`Server running on port ${port}`);
  54. });
复制代码
uniapp的界面
  1. <template>
  2.   <view class="container">
  3.     <view>
  4.       <input v-model="userName" placeholder="用户名"/>
  5.       <input v-model="groupName" placeholder="群名"/>
  6.       <button @click="joinGroup">加入群</button>
  7.       <button @click="kickUser">踢人</button>
  8.     </view>
  9.     <view>
  10.       <view id="messages">
  11.         <view v-for="(msg, index) in messages" :key="index">{{ msg }}</view>
  12.       </view>
  13.       <input v-model="message" placeholder="输入聊天"/>
  14.       <button @click="sendMessage">聊天</button>
  15.     </view>
  16.   </view>
  17. </template>
  18. <script>
  19. import io from 'socket.io-client';
  20. export default {
  21.   data() {
  22.     return {
  23.       socket: null,
  24.       userName: 'wanghaibin',
  25.       groupName: 'wanghaibin',
  26.       message: '',
  27.       messages: []
  28.     };
  29.   },
  30.   onLoad() {
  31.     this.socket = io('http://127.0.0.1:3000');
  32.     this.socket.on('message', (msg) => {
  33.       this.messages.push(msg);
  34.     });
  35.   },
  36.   methods: {
  37.     joinGroup() {
  38.       this.socket.emit('joinGroup', { groupName: this.groupName, userName: this.userName });
  39.     },
  40.     sendMessage() {
  41.       if (this.message.trim() !== '') {
  42.         this.socket.emit('sendMessage', { groupName: this.groupName, message: this.message, userName: this.userName });
  43.         this.message = '';
  44.       }
  45.     },
  46.     kickUser() {
  47.       const userNameToKick = prompt('Enter the username to kick:');
  48.       this.socket.emit('kickUser', { groupName: this.groupName, userName: userNameToKick });
  49.     }
  50.   }
  51. };
  52. </script>
  53. <style>
  54. .container {
  55.   padding: 20px;
  56. }
  57. #messages {
  58.   height: 300px;
  59.   overflow-y: scroll;
  60.   border: 1px solid #ccc;
  61.   margin-bottom: 10px;
  62. }
  63. input {
  64.   display: block;
  65.   margin: 10px 0;
  66. }
  67. button {
  68.   display: block;
  69.   margin: 10px 0;
  70. }
  71. </style>
复制代码
运行结果:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4