node.js 用socket实现聊天的示例代码

下面是讲解“node.js用socket实现聊天的示例代码的完整攻略”。

1.准备工作

首先,我们需要准备node.js环境。你可以在官网上下载对应的安装包,安装完成后,打开命令行工具,输入命令 node -v,如果命令行中输出你的node.js版本号,则说明你已经成功安装node.js环境。如果没有,则需要重新检查安装。

接下来,我们需要安装socket.io模块,可以使用npm来安装。进入命令行终端,输入命令npm install socket.io --save

2.代码实现

具体实现过程中,首先需要创建一个简单的聊天室页面,然后,通过socket技术将网页与服务端实现双向通信,即服务器可以向客户端发送消息,客户端也可以向服务器发送消息,从而实现聊天室的实时交互。

这里我们先给出服务端的代码。

var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(3000);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }
    res.writeHead(200);
    res.end(data);
  });
}

io.on('connection', function (socket) {
  socket.emit('message', {message: 'Welcome to the chat room!'});
  socket.on('send', function (data) {
    io.sockets.emit('message', data);
  });
});

上面代码是一个非常简单的node.js程序,其中:

  • 引入http、socket.io和fs模块;
  • 创建一个http服务器并将其连接到socket.io上;
  • 设置服务器监听3000端口,启动成功则可打开浏览器访问页面;
  • 如果发现错误,则返回错误信息;
  • 当客户端与服务器建立连接时,发送欢迎消息;
  • 当客户端发送消息时,将消息发送给所有客户端。

客户端的代码可以采用index.html实现,关键代码如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>Chat Room</title>
  <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
</head>
<body>
  <ul id="messages"></ul>
  <div class="chat-box">
    <form id="chatForm" action="">
      <input id="m" autocomplete="off">
      <button>Send</button>
    </form>
  </div>
  <script>
    var socket = io();
    socket.on('message', function (data) {
      var li = document.createElement('li');
      li.innerHTML = data.message;
      document.getElementById("messages").appendChild(li);
    });

    var form = document.getElementById('chatForm');
    var message = document.getElementById('m');
    var messages = document.getElementById('messages');

    form.onsubmit = function() {
      socket.emit('send', { username: 'me', message: message.value });
      message.value = '';
      return false;
    };
  </script>
</body>
</html>

签到我们的文本区域,还有一个很重要的点,就是md格式的代码块引用需要使用 ``` (也就是键盘的数字1左边那个键)来进行引用,建议注意一下。

3.详细说明

以上两段代码分别对应的是服务端和客户端的代码,实现一个简单的聊天,其实核心内容就是要实现双向socket通信,在这个之前我们可以先了解一下socket。

  • 什么是socket
    Socket是一种特殊的文件,一个进程可以打开该文件,并和其他进程交换数据,WinSock保留了UNIX中关于socket的概念和函数,实现跨越网络通信,被列入IETF文档(RFC 793)。

简单来说,Socket就是任意两个程序间的通讯渠道。

对于 node.js来说,socket.io是一个非常便捷的开发库,它可在webSocket没有得到广泛支持的时代,提供浏览器和服务器之间实时双向通信的功能。它既可以在客户端也可以在服务器端运行,基于socket.io,可以轻松实现客户端和服务端之间的socket通信。

  • socket.io 的流程

使用socket.io实现聊天的最重要的一点是要理解它的通信流程,即如何通过socket.io实现客户端和服务端之间的双向通信。

首先是建立连接

进入一个页面后客户端通过 io() 连接到Websocket服务器上;
创建一个WebSocket连接,这个连接是HTTP的一个握手过程,交由HTTP协议进行,HTTP协议过程中会在客户端和服务端之间进行一次握手过程,从而形成一个持久的连接。

客户端和服务端分别对应处理

每个socket维护了一个客户端(浏览器)和服务器之间的连接
服务端监听所有的socket连接,客户端监听特定的socket连接;
通信只能通过这个socket进行,即初始sessionId已经确定,直接通过sessionId就可以完成消息的推送。

然后就是处理交互

socket.on(): 监听客户端事件
sock.emit(): 触发服务器事件
sock.broadcast.emit(): 广播(除自己以外的客户端都可以收到)。
io.sockets.socket(clientid).emit(): 指定用户发送消息。
io.sockets.emit() : 全局广播,从而实现实时性的聊天通信。

最后就是断开连接

客户端断开连接后,服务器监听到disconnect事件,进行后续的处理。
根据 socket.io api 提供的 socket.disconnect([close]) ,服务端可以关闭当前的 socket 连接。

以上就是socket.io的通信流程和方法,动手实现一下这个小小的聊天室也是很有意思的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node.js 用socket实现聊天的示例代码 - Python技术站

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

相关文章

  • NodeJs模拟登陆正方教务

    下面是“NodeJs模拟登陆正方教务”的完整攻略: 一、前置准备 在开始NodeJs模拟登陆正方教务之前,我们需要保证以下几点: 学校教务系统平台支持模拟登陆,常见的支持教务系统有“正方教务系统”、“智慧校园”等; 获取学校教务系统的账号和密码,以进行模拟登陆; 安装NodeJs开发环境和npm包管理工具,以便安装相关插件。 二、安装必要插件 模拟登陆正方教…

    node js 2023年6月8日
    00
  • node中http模块的使用及执行流程

    当我们需要在node应用中进行HTTP通信(例如发送HTTP请求或创建HTTP服务器)时,可以使用node自带的HTTP模块(即”http”模块)。在本攻略中,我们将深入探讨http模块,包括其基本API、执行流程等。 http模块 在node中,我们可以使用以下代码来引入http模块: const http = require(‘http’); http模…

    node js 2023年6月8日
    00
  • node.js中的fs.readdir方法使用说明

    下面是一份详细的“node.js中的fs.readdir方法使用说明”的攻略。 fs.readdir方法介绍 fs.readdir()是Node.js中的一个内置模块,用于读取目录。其使用方法如下: fs.readdir(path[, options], callback); 其中,path表示要读取的目录,options表示可选的一些参数,callback…

    node js 2023年6月8日
    00
  • Node.js中readline模块实现终端输入

    下面是Node.js中readline模块实现终端输入的完整攻略。 什么是readline模块 readline是Node.js内置的模块,它提供了从流(例如stdin和文件)中逐行读取数据的功能。该模块主要用于读取用户在终端中的输入,支持基本的编辑操作(如回退、前进、删除等)。 readline模块的基本使用方法 在使用readline模块前,需要先使用r…

    node js 2023年6月8日
    00
  • Java基于正则表达式实现xml文件的解析功能详解

    Java 基于正则表达式提取 XML 数据 在 Java 中,使用正则表达式可以通过字符串匹配的方式提取 XML 文件中所需的信息。本文介绍如何使用 Java 正则表达式提取 XML 数据的完整攻略。 1. 实现思路 XML 文件的结构和数据都是有层次结构的,因此可以使用正则表达式来匹配 XML 标签和属性。实现思路如下: 读取 XML 文件,将其转化为字符…

    node js 2023年6月8日
    00
  • 详解nodejs内置模块

    详解Node.js内置模块 Node.js是一个基于Chrome V8引擎的服务器端JavaScript解释器。它使用一个事件驱动、非阻塞I/O模型,使其轻量高效。在Node.js中,有很多内置模块,它们提供了丰富的功能,可以帮助我们开发出高效、健壮的应用程序。在本文中,我们将深入研究一些常用的内置模块。 assert模块 assert模块是Node.js中…

    node js 2023年6月8日
    00
  • nodejs中使用archive压缩文件的实现代码

    要在 Node.js 中使用 Archive 压缩文件,我们可以使用 node-archiver 库。该库提供了一组简单的 API,可以方便地进行压缩文件操作。 以下是使用 node-archiver 压缩文件的步骤: 步骤 1:安装 node-archiver 库 在终端或命令提示符中,使用以下命令安装 node-archiver: npm install…

    node js 2023年6月8日
    00
  • 如何通过javaScript去除字符串两端的空白字符

    要通过javaScript去除字符串两端的空白字符,可以使用String对象提供的trim()方法。以下是完整攻略: 1. 使用trim()方法去除字符串两端的空白字符 trim()方法可以去除字符串的两端空白字符(包括空格、制表符、换行符等)。使用方法如下: var str = " hello world! "; str = str.t…

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