使用node、Socket.io 搭建简易聊天室(二)

简介: 使用node、Socket.io 搭建简易聊天室
  • 服务端

监听服务器建立连接和断开连接

io.on('connection', socket => {
    console.log('a user connected!');
    //disconnect
    socket.on('disconnect', () => {
        console.log('a user disconnected!');
    })
}

向全体人员广播

io.sockets.emit(自定义参数,data);

向全体人员广播

io.emit(自定义参数, data);

发送信息

socket.emit(自定义参数,data)

接收信息

socket.on(自定义参数,callback)

用户断开连接触发事件

socket.on('disconnect',callback);

信息传输对象为排除当前socket 对应的 client 的其他client

socket.broadcast.to(socketId ).emit('msg', msg)

向某房间发送消息

io.to(roomId).emit('event name', {
    // some data
})

加入/离开房间

// join room
socket.join(roomId);
// leave room
socket.leave(roomId);

服务端代码

const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
// Express 初始化app可以提供给HTTP服务器的函数处理程序
const { Server } = require("socket.io");
const io = new Server(server);
// socket.io自动为我们服务客户端传递server(HTTP 服务器)对象来初始化 的新实例。然后我监听connection传入套接字的事件并将其记录到控制台
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});
let roomInfo = {};
let users = [];
io.sockets.on('connection', socket => {
  socket.on('disconnect', () => {
    console.log(`客户端断开链接`) 
  })
  socket.on('login', user => {
    if (-1 != users.indexOf(user)) {
      return false;
    }
    users.push(user)
    io.sockets.emit('login', user)
    io.sockets.emit('updateUserList', users)
  })
  socket.on('chat', data => {
    console.log(data, 'data')
    io.sockets.emit('chat', data)
  })
  socket.on('creatGroup', data => {
    if (!(data.roomId in roomInfo)) {
      roomInfo[data.roomId] = data;
    }
    io.sockets.emit('creatGroup', data.roomId)
  })
})
server.listen(3000, () => {
  console.log('listening on *:3000');
});
  • 客户端
    socket.emit(自定义参数,data) //发送信息
    socket.on(自定义参数,callback//接收信息
    部分js代码
  <script src="/socket.io/socket.io.js"></script>
  <script>
  socket = io.connect();
    //登录
    loginDom.addEventListener('click', () => {
      let user = userDom.value.trim();
      if (!user) {
        alert('用户名为空')
        return
      }
      socket.emit('login', user, 1)
    })
    // 创建群组
    creatGroupDom.addEventListener('click', () => {
      let user = userDom.value.trim();
      let group = { user, roomId: `room_id_${(Date.now())}` }
      socket.emit('creatGroup', group)
    })
    // 监听创建群组
    socket.on('creatGroup', data => {
      creatGroupDom.innerHTML = `<dt>群组列表</dt>`
    })
    //服务器连接提示
    socket.on('connect', () => {
      addMsg(roomNoticeDom, `服务器连接成功`)
    })
    //登录
    socket.on('login', (user) => {
      addMsg(roomNoticeDom, `${user}进入房间`)
      document.getElementById('user').disabled = true;
    })
    //更新用户列表
    socket.on('updateUserList', users => {
      userListDom.innerHTML = `<dt>用户列表</dt>`
      // userListDom.removeChild(ddDom)
      for (let user of users) {
        let dd = document.createElement('dd')
        dd.innerText = user;
        userListDom.appendChild(dd)
      }
    })
    //监听消息
    socket.on('chat', (data) => {
      console.log('接收到消息')
      var item = document.createElement('li');
      item.style.background = '#ff0'
      item.textContent = `${data.user}说:${data.message}`;
      messages.appendChild(item);
      window.scrollTo(0, document.body.scrollHeight + 30);
    })
    //发送消息
    form.addEventListener('submit', (e) => {
      e.preventDefault();
      if (message.value) {
        console.log(message, user, '发送信息成功')
        socket.emit('chat', { message: message.value, user: userDom.value.trim() })
      }
      message.value = '';
    })
  </script>   
  • 预览

目录
相关文章
|
8月前
|
存储 Python
【python】基于Socket的聊天室Python开发
【python】基于Socket的聊天室Python开发
|
4天前
|
监控 算法 JavaScript
基于 Node.js Socket 算法搭建局域网屏幕监控系统
在数字化办公环境中,局域网屏幕监控系统至关重要。基于Node.js的Socket算法实现高效、稳定的实时屏幕数据传输,助力企业保障信息安全、监督工作状态和远程技术支持。通过Socket建立监控端与被监控端的数据桥梁,确保实时画面呈现。实际部署需合理分配带宽并加密传输,确保信息安全。企业在使用时应权衡利弊,遵循法规,保障员工权益。
18 7
|
4月前
|
JSON 前端开发 JavaScript
socket.io即时通信前端配合Node案例
本文介绍了如何使用socket.io库在Node.js环境下实现一个简单的即时通信前端配合案例,包括了服务端和客户端的代码实现,以及如何通过socket.io进行事件的发送和监听来实现实时通信。
59 2
|
5月前
|
JavaScript 前端开发 Ubuntu
如何在 VPS 上安装 Express(Node.js 框架)并设置 Socket.io
如何在 VPS 上安装 Express(Node.js 框架)并设置 Socket.io
70 0
|
5月前
|
存储 JavaScript 数据库
如何使用 Socket.IO、Angular 和 Node.js 创建实时应用程序
如何使用 Socket.IO、Angular 和 Node.js 创建实时应用程序
33 0
|
8月前
|
NoSQL JavaScript 数据库连接
超级实用!详解Node.js中的mongodb模块和socket.io模块
超级实用!详解Node.js中的mongodb模块和socket.io模块
|
3月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
33 0
|
6月前
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
65 4
|
6月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
40 3
|
6月前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
【7月更文挑战第26天】在网络的数字宇宙中,Python Socket编程是开启网络世界大门的钥匙。本指南将引领你从基础到实战,成为网络世界的建筑师。
70 2