Nodejs环境实现socket通信过程解析

Node.js环境实现socket通信过程解析

什么是Socket通信

Socket(套接字)是一种IPC(进程间通信)的方式,通常也称作"套接字"。通俗理解,套接字就像两人之间的一条电话线,通过这条线实现一对一或者一对多的实时通信。

在计算机网络中,Socket又称为“网络套接字”,是一种基于TCP/IP协议的网络通信方式。与传统的HTTP协议不同,它是一种面向连接的协议,即每次通信之前需要先建立一条双向连接。

实现Socket通信的方法

在JavaScript中,可以通过各种库和框架来实现Socket通信。其中,Node.js是一种非常常用的开发环境,通过其内置的socket库,可以方便地实现Socket通信。

下面是Node.js环境实现Socket通信的步骤:

  1. 创建Socket服务器端
const net = require('net');

const server = net.createServer((socket) => {
  console.log(`客户端 ${socket.remoteAddress}:${socket.remotePort} 已连接`);
  socket.write('欢迎进入聊天室!');
  socket.on('data', (data) => {
    console.log(`客户端 ${socket.remoteAddress}:${socket.remotePort} 发来消息: ${data}`);
    // 将消息广播给其他所有客户端
    server.getConnections((err, clients) => {
      if (err) { throw err; }
      clients.forEach((c) => {
        if (c !== socket && c.writable) {
          c.write(`${socket.remoteAddress}:${socket.remotePort}:${data}`);
        }
      });
    });
  });
}).listen(8888, () => {
  console.log('Socket服务器已启动');
});

以上是一个简单的Socket服务器端,可以监听8888端口,等待客户端连接。当客户端连接后,会发送一条欢迎消息,并且可以监听到客户端发送的消息,并在控制台输出。

  1. 创建Socket客户端
const net = require('net');

const client = new net.Socket();
const host = '127.0.0.1';
const port = 8888;

client.connect(port, host, () => {
  console.log(`已连接至服务器 ${host}:${port}`);
  client.write('Hello World!');
});

client.on('data', (data) => {
  console.log(`收到来自服务器的消息:${data}`);
});

client.on('close', () => {
  console.log('连接已关闭');
});

以上是一个简单的Socket客户端,可以连接到服务器,并发送一条消息。同时也监听到服务器返回的消息,并在控制台输出。

Socket通信的应用场景

对于Socket通信,最常见的应用场景就是实现实时通讯,例如聊天室、直播间等应用。当然,在广泛的网络应用中,Socket通信也有着其他应用,例如视频流传输、游戏对战等。

示例1:应用场景——聊天室

创建一个简单的聊天室,使用Node.js的Socket库实现实时聊天。

  1. 创建服务器端
const net = require('net');

const server = net.createServer((socket) => {
  console.log(`客户端 ${socket.remoteAddress}:${socket.remotePort} 已连接`);
  socket.write('欢迎进入聊天室!');
  socket.on('data', (data) => {
    console.log(`客户端 ${socket.remoteAddress}:${socket.remotePort} 发来消息: ${data}`);
    // 将消息广播给其他所有客户端
    server.getConnections((err, clients) => {
      if (err) { throw err; }
      clients.forEach((c) => {
        if (c !== socket && c.writable) {
          c.write(`${socket.remoteAddress}:${socket.remotePort}:${data}`);
        }
      });
    });
  });
}).listen(8888, () => {
  console.log('Socket服务器已启动');
});

以上是一个简单的Socket服务器端,可以监听8888端口,等待客户端连接。当客户端连接后,会发送一条欢迎消息,并且可以监听到客户端发送的消息,并将消息广播给其他所有客户端。

  1. 创建客户端
const net = require('net');

const client = new net.Socket();
const host = '127.0.0.1';
const port = 8888;

client.connect(port, host, () => {
  console.log(`已连接至服务器 ${host}:${port}`);
});

client.on('data', (data) => {
  console.log(`${data}`);
});

process.stdin.on('data', (data) => {
  client.write(data);
});

以上是一个简单的Socket客户端,可以连接到服务器,并接收广播的消息。同时也可以在控制台输入消息,并发送给服务器。

  1. 运行程序

在控制台中,开两个窗口,分别运行服务器端和客户端。当客户端连接上服务器后,就可以实时聊天了。

示例2:应用场景——在线画图

创建一个简单的在线画图应用,使用Node.js的Socket库实现实时绘图。

  1. 创建服务器端
const net = require('net');

const server = net.createServer((socket) => {
  console.log(`客户端 ${socket.remoteAddress}:${socket.remotePort} 已连接`);
  socket.write('欢迎进入在线画图应用!');
  socket.on('data', (data) => {
    console.log(`客户端 ${socket.remoteAddress}:${socket.remotePort} 发来消息`);
    // 将消息广播给其他所有客户端
    server.getConnections((err, clients) => {
      if (err) { throw err; }
      clients.forEach((c) => {
        if (c !== socket && c.writable) {
          c.write(data);
        }
      });
    });
  });
}).listen(8888, () => {
  console.log('Socket服务器已启动');
});

以上是一个简单的Socket服务器端,可以监听8888端口,等待客户端连接。当客户端连接后,会发送一条欢迎消息,并且可以监听到客户端发送的消息,并将消息广播给其他所有客户端。

  1. 创建客户端
<!--index.html-->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>在线画图</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      canvas {
        background: white;
        border: 1px solid black;
        cursor: crosshair;
      }
    </style>
  </head>
  <body>
    <canvas id="canvas"></canvas>

    <script>
      const canvas = document.querySelector('#canvas');
      const ctx = canvas.getContext('2d');
      const socket = new WebSocket('ws://localhost:8888');

      canvas.addEventListener('mousedown', onmousedown);
      canvas.addEventListener('mousemove', onmousemove);
      canvas.addEventListener('mouseup', onmouseup);

      function onmousedown(e) {
        ctx.beginPath();
        ctx.moveTo(e.offsetX, e.offsetY);
        canvas.addEventListener('mousemove', onmousemove);
      }

      function onmousemove(e) {
        ctx.lineTo(e.offsetX, e.offsetY);
        ctx.stroke();
        const data = JSON.stringify({
          type: 'moveTo',
          x: e.offsetX,
          y: e.offsetY,
        });
        socket.send(data);
      }

      function onmouseup(e) {
        ctx.closePath();
        canvas.removeEventListener('mousemove', onmousemove);
      }

      socket.addEventListener('open', (event) => {
        console.log('已连接到服务器');
      });

      socket.addEventListener('message', (event) => {
        const data = JSON.parse(event.data);
        if (data.type === 'moveTo') {
          ctx.beginPath();
          ctx.moveTo(data.x, data.y); 
        } else if (data.type === 'lineTo') {
          ctx.lineTo(data.x, data.y);
          ctx.stroke();
        }
      });
    </script>
  </body>
</html>

以上是一个简单的Socket客户端,使用WebSocket连接到服务器,并通过HTML Canvas实现在线绘图。当鼠标在画布上移动时,客户端将发送对应的坐标给服务器,服务器将接收到的坐标再广播给其他客户端。

  1. 运行程序

在控制台中,运行服务器端。在浏览器中,打开index.html文件,并使用多个标签页测试在线绘图效果。可以看到,当一个客户端在画布上移动时,其他客户端也会实时看到该画布上的移动操作。

结论

以上两个示例展示了使用Node.js环境实现Socket通信的基本步骤和应用场景。通过Socket通信,我们可以实现实时聊天、在线协作等各种应用,为我们的网络应用增加了更多的可能性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nodejs环境实现socket通信过程解析 - Python技术站

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

相关文章

  • Node.js + express实现上传大文件的方法分析【图片、文本文件】

    下面我将为你详细讲解“Node.js + express实现上传大文件的方法分析【图片、文本文件】”的完整攻略。 一、背景介绍 在web开发中,经常会需要上传大文件,例如图片、文本文件等,Node.js提供了处理文件上传的模块,其中最常用的就是multer中间件。multer中间件可以让我们轻松处理上传文件时产生的数据,同时也支持客户端上传多个文件。下面我将…

    node js 2023年6月8日
    00
  • Sea.JS知识总结

    Sea.JS知识总结 什么是Sea.JS? Sea.JS是一个遵循CMD规范的JavaScript模块加载器,可以实现模块的异步加载、依赖管理等功能,可以使得JavaScript算法复杂的应用变得更具可维护性和清晰可见性。 Sea.JS特点 遵循CMD规范,模块的代码放在单独的文件中,在需要的时候动态加载,使得代码更为模块化、复用性更好、依赖性管理更为清晰。…

    node js 2023年6月8日
    00
  • 浅析node命令行交互原理

    浅析node命令行交互原理 简介 在日常工作中,我们可能需要通过命令行与node.js程序进行交互来完成一些任务。本文将会深入浅出地讲解node命令行交互的原理及相关示例。 node命令行交互原理 node.js的命令行交互主要是基于node.js的标准库 readline 模块实现的。readline 模块提供了一组接口,可以创建一个读取命令行输入流的实例…

    node js 2023年6月8日
    00
  • Node.js 日志处理模块log4js

    Node.js 日志处理模块log4js是一个流行的日志库,可用于记录应用程序的日志。 下面是使用log4js的完整攻略: 1. 安装log4js 使用以下npm命令安装log4js:npm install log4js –save 2. 配置log4js 创建一个名为log4js.json的配置文件(或者是一个JavaScript模块),定义日志的输出和…

    node js 2023年6月8日
    00
  • 如何用Node写页面爬虫的工具集

    如何用Node写页面爬虫的工具集? 一、准备工作 安装Node.js环境。 安装Node.js的包管理器npm,安装方法为在终端中输入npm install npm -g。 安装request、cheerio、iconv-lite等Node模块,这些模块用于发起网络请求、解析HTML页面内容和处理编码问题,命令行方式为npm install request …

    node js 2023年6月8日
    00
  • 用Electron写个带界面的nodejs爬虫的实现方法

    Electron是一个开源框架,它能够让开发者使用Web技术(如HTML、CSS和JavaScript)创建跨平台应用程序。这里将介绍如何使用Electron构建一个带界面的nodejs爬虫应用程序的实现方法: 1. 安装Electron 首先需要安装和设置Electron,可参考Electron官方文档进行安装。 2. 创建项目 在本地创建爬虫项目,新建一…

    node js 2023年6月8日
    00
  • node版本下报错build: `vue-cli-service build`问题及解决

    当使用vue-cli-service打包vue项目时,可能会遇到”node版本下报错build: vue-cli-service build问题”,这通常是由于node版本过低或过高导致的。下面是解决该问题的几个步骤。 1. 查看当前node和npm版本 首先,需要查看当前node和npm版本是否正确。可以通过以下命令进行查看: node -v npm -v…

    node js 2023年6月8日
    00
  • 浅析Nodejs npm常用命令

    我将为您详细讲解“浅析Nodejs npm常用命令”的完整攻略。 一、 什么是npm? npm是Node.js的包管理工具,它能够帮助我们安装、管理依赖,以及发布我们自己的包。 二、npm常用命令 1. npm init npm init命令可以让我们创建一个新的package.json文件,这个文件是用来描述我们的项目的,可以在这个文件中设置项目的基本信息…

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