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日

相关文章

  • 使用GruntJS构建Web程序之Tasks(任务)篇

    使用GruntJS构建Web程序之Tasks(任务)篇 在 GruntJS 中,任务(Tasks)是指一组执行一些特定的工作的命令。GruntJS 提供了很多内置的任务,比如文件的复制、合并、压缩等等,同时也支持使用插件编写自定义任务。在本篇中,我们将深入学习 GruntJS 的任务相关知识。 任务的定义 下面是一个使用 GruntJS 定义任务的示例: m…

    node js 2023年6月8日
    00
  • nodejs win7下安装方法

    Node.js Win7 下安装方法 简介 Node.js 是基于 Chrome V8 引擎的 JavaScript 运行环境,能够使 JavaScript 在服务器端运行,我们可以利用其带来的高效率和功能扩展来开发网站、应用、命令行工具等。 在本篇攻略中,我们将介绍如何在 Windows 7 操作系统下安装 Node.js。 安装步骤 官网下载 首先,我们…

    node js 2023年6月8日
    00
  • 基于node简单实现RSA加解密的方法步骤

    下面是基于node简单实现RSA加解密的方法步骤的完整攻略。 简介 RSA是非对称加密算法,它是公开密钥加密算法中的一种。在RSA加解密过程中,需要使用公钥和私钥两个密钥。它的加密过程需要用到公钥,而解密过程需要用到私钥。 在node中,我们可以使用crypto库来实现RSA加解密。 步骤 生成RSA密钥对 const crypto = require(‘c…

    node js 2023年6月8日
    00
  • nginx返回json或者文本格式的方法

    当使用Nginx作为Web服务器时,我们可以使用Nginx的内置模块来返回Json或者文本格式的内容,下面是详细的攻略步骤: 1. 配置Nginx 在Nginx的配置文件中,我们需要配置一个location来指定需要返回Json或者文本格式的url地址,例如: location /api/example { add_header Content-Type ‘…

    node js 2023年6月8日
    00
  • 利用jsonp与代理服务器方案解决跨域问题

    解决跨域问题是前端开发中的常见问题,其中使用JSONP与代理服务器的方案也是常见的解决方案。下面我将为您详细介绍JSONP与代理服务器的方案解决跨域问题的完整攻略。 什么是跨域问题 在同源策略下,浏览器只允许对同一域名下的资源进行访问。如果一个站点的JavaScript能够请求到另一个域名下的资源,那么这个站点就存在跨域问题。 JSONP方案解决跨域问题 J…

    node js 2023年6月8日
    00
  • 如何通过node.js来写接口详解

    下面我来为你详细讲解“如何通过node.js来写接口详解”的完整攻略。 如何通过Node.js来写接口详解 1. 什么是接口 接口(API)是指不同软件系统或不同组件之间的通信协议。在开发Web应用时,我们需要通过API来获取数据和与远程服务器进行交互。因此,学会如何编写接口是非常重要的。 2. Node.js介绍 Node.js是一个基于Chrome V8…

    node js 2023年6月8日
    00
  • node.js的http.createServer过程深入解析

    现在我将详细讲解一下“node.js的http.createServer过程深入解析”的完整攻略,希望对您有所帮助。 http.createServer的作用 在深入了解http.createServer的过程之前,我们需要先了解它的作用。http.createServer是node.js中的一个方法,用于创建一个http服务器。我们可以通过该服务器监听客户…

    node js 2023年6月8日
    00
  • 浅谈react性能优化的方法

    下面是详细讲解“浅谈React性能优化的方法”的完整攻略。 浅谈React性能优化的方法 在使用React进行开发时,随着项目体量和复杂度的增加,可能会遇到性能方面的问题。本文介绍了一些React性能优化的方法,可以帮助您更好地优化项目性能。 一、使用PureComponent或React.memo 对于一些简单的组件,可以使用PureComponent或R…

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