Nodejs+Socket.io实现通讯实例代码

下面是Nodejs+Socket.io实现通讯实例代码的完整攻略:

1. 简介

Nodejs是一个使用JavaScript编写服务器端代码的平台,Socket.io是一种实时应用程序框架,用于在服务器和客户端之间通过WebSockets进行双向通信。

本文将以一个聊天室应用为例,介绍如何使用Nodejs和Socket.io实现实时通信的功能。

2. 安装Socket.io

要使用Socket.io,需要先安装它。可以使用以下命令在Nodejs项目中安装Socket.io:

npm install socket.io

3. 实现服务器端代码

服务器端代码使用Nodejs编写,代码实现以下功能:

  • 监听客户端的连接请求并接受连接;
  • 监听客户端发送的消息并广播给所有连接的客户端。

以下是服务器端代码的实现:

const server = require('http').createServer();
const io = require('socket.io')(server);

io.on('connection', socket => {
  console.log('a user connected');

  socket.on('chat', message => {
    console.log('message: ' + message);
    io.emit('chat', message);
  });

  socket.on('disconnect', () => {
    console.log('user disconnected');
  });
});

server.listen(3000, () => {
  console.log('listening on *:3000');
});

4. 实现客户端代码

客户端代码使用Socket.io提供的客户端库实现。代码实现以下功能:

  • 连接服务器;
  • 发送消息给服务器;
  • 接受服务器广播的消息并展示在页面上。

以下是客户端代码的实现:

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>Socket.io Chat Example</title>
</head>

<body>
  <ul id="messages"></ul>
  <form id="form">
    <input id="input" autocomplete="off">
    <button>Send</button>
  </form>

  <script src="/socket.io/socket.io.js"></script>
  <script>
    const socket = io();

    const form = document.querySelector('#form');
    const input = document.querySelector('#input');
    const messages = document.querySelector('#messages');

    form.addEventListener('submit', event => {
      event.preventDefault();
      const message = input.value;
      socket.emit('chat', message);
      input.value = '';
    });

    socket.on('chat', message => {
      const li = document.createElement('li');
      li.textContent = message;
      messages.appendChild(li);
    });
  </script>
</body>

</html>

5. 示例说明

下面介绍两种有关聊天室应用的实例说明。

示例一:在同一页面中使用两个聊天室

可以在同一页面中使用两个聊天室,一个用于公共聊天,另一个用于私人聊天。以下是实现方式:

io.on('connection', socket => {
  console.log('a user connected');

  // 实现公共聊天室
  socket.on('public chat', message => {
    console.log('public message: ' + message);
    io.emit('public chat', message);
  });

  // 实现私人聊天室
  socket.on('private chat', (message, target) => {
    console.log('private message to ' + target + ': ' + message);
    socket.to(target).emit('private chat', message);
  });

  socket.on('disconnect', () => {
    console.log('user disconnected');
  });
});
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>Socket.io Chat Example</title>
</head>

<body>
  <h2>Public Chat Room</h2>
  <ul id="public-messages"></ul>
  <form id="public-form">
    <input id="public-input" autocomplete="off">
    <button>Send</button>
  </form>

  <h2>Private Chat Room</h2>
  <ul id="private-messages"></ul>
  <form id="private-form">
    <input id="private-input" autocomplete="off">
    <input id="private-target" placeholder="Target" autocomplete="off">
    <button>Send</button>
  </form>

  <script src="/socket.io/socket.io.js"></script>
  <script>
    const socket = io();

    const publicForm = document.querySelector('#public-form');
    const publicInput = document.querySelector('#public-input');
    const publicMessages = document.querySelector('#public-messages');

    const privateForm = document.querySelector('#private-form');
    const privateInput = document.querySelector('#private-input');
    const privateTarget = document.querySelector('#private-target');
    const privateMessages = document.querySelector('#private-messages');

    publicForm.addEventListener('submit', event => {
      event.preventDefault();
      const message = publicInput.value;
      socket.emit('public chat', message);
      publicInput.value = '';
    });

    socket.on('public chat', message => {
      const li = document.createElement('li');
      li.textContent = message;
      publicMessages.appendChild(li);
    });

    privateForm.addEventListener('submit', event => {
      event.preventDefault();
      const message = privateInput.value;
      const target = privateTarget.value;
      socket.emit('private chat', message, target);
      privateInput.value = '';
    });

    socket.on('private chat', message => {
      const li = document.createElement('li');
      li.textContent = message;
      privateMessages.appendChild(li);
    });
  </script>
</body>

</html>

示例二:使用用户名和房间进行分组

可以使用用户名和房间进行分组,避免不同房间之间的消息冲突。以下是实现方式:

io.on('connection', socket => {
  console.log('a user connected');

  socket.on('join', (username, room) => {
    console.log('user ' + username + ' joined room ' + room);
    socket.join(room);
    io.to(room).emit('join', username + ' joined the room');
  });

  socket.on('leave', room => {
    console.log('user left room ' + room);
    socket.leave(room);
    io.to(room).emit('leave', 'a user left the room');
  });

  socket.on('chat', (message, room) => {
    console.log('message: ' + message + ', room: ' + room);
    io.to(room).emit('chat', message);
  });

  socket.on('disconnect', () => {
    console.log('user disconnected');
  });
});
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>Socket.io Chat Example</title>
</head>

<body>
  <div id="login">
    <h2>Login</h2>
    <input id="username" placeholder="Username" autocomplete="off">
    <input id="room" placeholder="Room" autocomplete="off">
    <button>Join Room</button>
  </div>

  <div id="chat" style="display: none;">
    <h2 id="room-name"></h2>
    <ul id="messages"></ul>
    <form id="form">
      <input id="input" autocomplete="off">
      <button>Send</button>
    </form>
  </div>

  <script src="/socket.io/socket.io.js"></script>
  <script>
    const socket = io();

    const login = document.querySelector('#login');
    const username = document.querySelector('#username');
    const room = document.querySelector('#room');
    const joinButton = document.querySelector('button');

    const chat = document.querySelector('#chat');
    const roomName = document.querySelector('#room-name');
    const messages = document.querySelector('#messages');
    const form = document.querySelector('#form');
    const input = document.querySelector('#input');

    joinButton.addEventListener('click', () => {
      const name = username.value;
      const roomName = room.value;
      socket.emit('join', name, roomName);
      login.style.display = 'none';
      chat.style.display = 'block';
      roomName.textContent = roomName;
    });

    form.addEventListener('submit', event => {
      event.preventDefault();
      const message = input.value;
      socket.emit('chat', message, roomName.textContent);
      input.value = '';
    });

    socket.on('join', message => {
      const li = document.createElement('li');
      li.textContent = message;
      messages.appendChild(li);
    });

    socket.on('leave', message => {
      const li = document.createElement('li');
      li.textContent = message;
      messages.appendChild(li);
    });

    socket.on('chat', message => {
      const li = document.createElement('li');
      li.textContent = message;
      messages.appendChild(li);
    });
  </script>
</body>

</html>

以上就是Nodejs+Socket.io实现通讯实例代码的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nodejs+Socket.io实现通讯实例代码 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • vue2从template到render模板编译入口详解

    Vue2从template到render模板编译入口详解 在Vue2中,我们可以使用template或者render函数来创建组件模板,而渲染模板的过程需要通过编译器进行处理。下面我们来详细了解Vue2的模板编译入口。 template编译入口 当我们使用template来定义组件时,Vue2会先把template编译成render函数,然后再去实例化组件。…

    node js 2023年6月9日
    00
  • 关于Node.js中Buffer的一些你可能不知道的用法

    关于Node.js中Buffer的一些你可能不知道的用法完整攻略如下: 简介 在Node.js中,Buffer是一个用于处理二进制数据的对象。在Buffer中,可以存储任意长度的数据,并且可以通过索引访问每个字节。 创建Buffer实例 Node.js中Buffer对象可以通过以下方式创建: // 创建指定长度的Buffer const buf1 = Buf…

    node js 2023年6月8日
    00
  • nodejs dgram模块广播+组播的实现示例

    下面就为大家详细介绍如何使用nodejs的dgram模块进行广播和组播的实现,包括示例说明。 什么是dgram模块? dgram 提供了实现 UDP 数据包 socket 的方式,它是 Node.js 标准库的一部分,用于处理网络数据通信。 广播和组播的概念 广播是指向同一广播网络内的所有网络设备传输消息的过程。广播的特点是传送迅速,但由于是向所有设备广播,…

    node js 2023年6月8日
    00
  • JS创建Tag标签的方法详解

    下面是针对“JS创建Tag标签的方法详解”的完整攻略。 1. document.createElement()方法 JavaScript中提供了 document.createElement() 方法,可以通过该方法创建指定的HTML标签元素。 语法格式如下: document.createElement(tagName); 其中 tagName 是字符串类…

    node js 2023年6月8日
    00
  • 如何利用node转发请求详解

    当需要在一个server上转发请求到另一个server时,可以利用Node的http模块自己编写一个服务器完成这个过程。下面是完成此过程的攻略: 步骤一. 安装和引入依赖包 安装http-proxy和httpnpm包: npm install http-proxy http –save 在代码中引入依赖包: const http = require(‘ht…

    node js 2023年6月8日
    00
  • nodejs实现大文件(在线视频)的读取

    一、前言 随着互联网技术的发展,越来越多的媒体资源被上传到互联网上,在线播放已经成为了一个趋势。在实现在线播放过程中,我们需要处理一些大文件读取的问题。nodejs提供了一些较好的解决方案,下面就来详细讲解一下如何用nodejs实现大文件(在线视频)的读取。 二、方案 在nodejs中,主要有两种实现大文件(在线视频)的读取的方式,分别是流式读取和分块读取。…

    node js 2023年6月8日
    00
  • NodeJS 模块开发及发布详解分享

    下面给出关于“NodeJS模块开发及发布详解分享”的完整攻略,包括以下内容: NodeJS模块的基本概念; NodeJS模块的分类; NodeJS模块的使用方法; NodeJS模块的开发过程; NodeJS模块的发布过程; 示例说明。 NodeJS模块的基本概念 NodeJS模块是指NodeJS中可复用的代码单位,具有独立的作用域和命名空间,可以引入其他模块…

    node js 2023年6月8日
    00
  • Node.js中child_process实现多进程

    下面是详细讲解“Node.js中child_process实现多进程”的完整攻略。 一、什么是child_process模块 在Node.js中,使用child_process模块可以创建并控制子进程。这个模块提供了四个函数:spawn、exec、execFile、fork,分别对应不同类型的子进程。 二、何时使用多进程 在一些需要高并发处理的场景中,单进程…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部