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日

相关文章

  • 跟我学Node.js(四)—Node.js的模块载入方式与机制

    跟我学Node.js(四)—Node.js的模块载入方式与机制 什么是模块 在Node.js中,每一个JavaScript文件都可以看作为一个独立的模块,而这些模块可以被其他JavaScript文件所引用和调用。模块可以帮助我们实现代码的重用,提高开发效率。 Node.js支持的模块载入方式 Node.js支持两种方式进行模块的载入:同步和异步。 同步方…

    node js 2023年6月8日
    00
  • 详解如何实现一个简单的Node.js脚手架

    详解如何实现一个简单的Node.js脚手架 什么是脚手架 脚手架是指为了快速搭建一个项目框架或是基础代码而提供的一套工具链、库和模板的集合。它可以帮助开发者快速创建出项目模板或基础代码,让开发者只需关注业务代码的实现,而不用花费时间来搭建项目框架。 实现一个简单的Node.js脚手架 第一步:创建项目 首先需要创建一个名为simple-node-cli的文件…

    node js 2023年6月8日
    00
  • 二叉树先序遍历的非递归算法具体实现

    一、什么是二叉树先序遍历的非递归算法 二叉树先序遍历的非递归算法是一种在不使用递归的情况下,实现先序遍历二叉树的方法。正常情况下,我们可以使用递归的方式对二叉树进行先序遍历。但是如果递归的层数太多,可能会导致栈溢出的问题。非递归算法可以避免这种情况发生,而且可以提高遍历效率。 二、具体实现步骤 1.首先,我们需要定义一个栈,用于存储二叉树节点。由于是先序遍历…

    node js 2023年6月8日
    00
  • Nodejs中获取当前函数被调用的行数及文件名详解

    对于Node.js中获取当前函数被调用的行数及文件名这个问题,我们可以通过调用Node.js的Error对象来实现这个功能。下面就是一个完整的攻略: 使用Error对象获取当前函数被调用的行数及文件名 我们可以在函数内部手动抛出一个错误,然后利用这个错误,获取到这个错误对象的stack属性,从而获取到被调用函数所在的文件名和行数。示例代码如下: functi…

    node js 2023年6月8日
    00
  • Angularjs根据json文件动态生成路由状态的实现方法

    下面是“Angularjs根据json文件动态生成路由状态的实现方法”的完整攻略: 目录结构 – app/ – js/ – controllers/ – homeController.js – aboutController.js – directives/ – navbarDirective.js – services/ – dataService.js …

    node js 2023年6月8日
    00
  • JS中的模糊查询功能

    下面是关于JS中模糊查询功能的完整攻略。 什么是模糊查询 模糊查询是指可以在不明确指定查询条件的情况下,自动查找与指定字符串相似的内容。例如,我们在搜索引擎中输入关键字时,就会出现相关的搜索结果,这就是利用了模糊查询功能。 在JS中,我们可以利用一些方法来实现对字符串的模糊查询。 JS字符串方法 在JS中,有一些字符串方法可以帮助我们实现模糊查询功能,下面来…

    node js 2023年6月8日
    00
  • Nodejs Post请求报socket hang up错误的解决办法

    下面我将为你详细讲解“Nodejs Post请求报socket hang up错误的解决办法”。 问题分析 当使用Nodejs发送Post请求时,可能会出现“socket hang up”错误,造成请求失败。这个错误通常发生在以下情况之一: 请求超时,服务器没有及时响应。 请求的数据量比较大,Nodejs默认的请求体大小限制被超出。 请求时发生了错误,导致请…

    node js 2023年6月8日
    00
  • Nodejs实现短信验证码功能

    为了实现短信验证码功能,可以通过Nodejs搭建一个基于REST API协议的服务器端应用程序。下面是一个完整攻略: 步骤一:准备环境 首先,确保你已经安装了Nodejs环境。可以从Nodejs官网下载安装:https://nodejs.org。 接着,你需要安装三个npm模块,分别是express(用于搭建Web应用框架)、body-parser(用于解析…

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