Node实现 Socket 通信

news2024/11/8 23:03:47

socket 通信流程 

        Socket通信,首先要知道 Socket 是什么,就是网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端被称为 socket ,举一个简单的例子就是两个人在线上进行聊天,即线上通信,那么socket通信的流程具体是怎样的?下面通过一张图来了解 socket 的通信流程:

        下面就来实现 socket通信,分两部分,其一是服务端,再者是客户端,那么先来按照图示的流程来完成对服务端(S端)的编写:

[ 小白注解:Node.js中提供了Net核心模块对 socket 的支持,需要引入Net模块,使用 net 提供的createServer() 方法创建基于流的 TCP 或 [IPC][] 服务器,创建一个变量保存客户端对象,使用 .on( 'connection' 监听用户是否接入,使用 .on('data' 对客户端发送消息的监听,同时对这个消息内容进行一个事件的广播,使用 .on('close' 监听数据错误的处理,使用 .on(close 对客户端关闭事件的监听,[可选] 进行一个服务器启动端口的监听使用listen()方法 ]

const net = require('net')

var chatServer = net.createServer(),    // 创建TCP服务器
    clientMap = new Object()            // 存储客户端对象

var i = 0   // 连接名称流水号

chatServer.on('connection', function (client) {
    console.log('客户端用户接入...')
    client.name = ++i
    clientMap[client.name] = client

    // 对客户端发送消息的监听
    client.on('data', function (data) {
        console.log('客户端传来:' + data)
        broadcast(data, client)
    })

    // 数据错误事件处理
    client.on('error',function (err) {
        console.log('Client Error : ' + err )
        client.end()
    })

    // 客户端关闭事件
    client.on('close',function (data) {
        delete clientMap[client.name]
        console.log(client.name + '下线了')
        client.broadcast(client.name + '下线了', client)
    })
})

// 消息广播
function broadcast(message, client){
    for (var key in clientMap) {
        clientMap[key].write(client.name + ':' + message + '\n')
    }
}

// 监听9000端口号
chatServer.listen(9000,() => {
    console.log('Socket Server Running ...')
})

        那么对服务端(S端)已经编写完成,可以自测一下是否启动成功,这里不再演示,待后续客户端一同演示;下面来完成客户端(C端)的编写:

[ 小白注解:引入Net模块,创建一个socket - new net.socket() ,connect()方法连接指定的服务端的端口 (host,port) ,连接到服务器(S端)之后,通过.on('data' 监听服务端传来的数据信息,同时可以向服务器进行数据发送传递,通过Node.js提供的 readline 模块,使用createInterface()方法构造,同时需要 .on('error' 做事件错误处理 和.on('close' 做用户下线反馈 ]

var net = require('net')

var port = 9000
var host = '127.0.0.1'

var client = new net.Socket()
client.setEncoding = 'UTF-8'

// 连接服务器
client.connect(port, host, function () {
    client.write('欢迎!')
})

// 收集
client.on('data',function (data) {
    console.log('服务端传来:' +  data)
    talk()
})

// 错误事件处理
client.on('error',function (err) {
    console.log('Error:' + err)
})

// 关闭连接
client.on('close',function (){ 
    console.log('Connection Closeed')
})

/* https://www.nodeapp.cn/readline.html#readline_readline
   readline - 用于从可读流读取数据 process.stdin-输入 process.stdout-输出  */

const readline = require('readline')
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
})

function talk() {
    rl.question('请输入:',(inputStr) => {
        if(inputStr != 'bye'){
            client.write(inputStr + '\n')
        }else{
            client.destroy()
        }
    })
} 

        以上已经完成S端和C端的代码编写,下面来进行测试运行!

socket 测试效果

· 打开CMD窗口切到编写目录文件进行运行( 运行命令: node + xx.js )

        S端文件 :SocketServer.js         ——  node SocketServer.js

        C端文件 :SocketClient.js          ——  node SocketClient.js


1. 启动服务器 

2. 启动客户端 

        启动客户端之后,此时客户端创建一个socket,连接服务器(127.0.0.1:9000),当客户端与服务器接入成功之后就会使用write()方法写入,此时服务器就会通过 .on('connection' 监听到有用户接入会进行一个打印,以及 .on('data' 监听到客户端传递的数据,调用 broadcast() 方法进行广播

3. 回看服务器

4. 在客户端中输入数据

         输入之后,会进行调用 talk()方法,进行一个写入,此时服务器监听到客户端的数据会对数据进行一个广播,此时被客户端监听到服务器广播的数据进行一个打印 .on('data',function(){ console.log('服务器传来'....) }) ,所以会返回服务端传...这段;可以看一下服务端是不是收到客户端传过去的这个 “在吗?” ,如下图:

 5. 再启动一个客户端

         启动第二个客户端之后,可以会看服务端,是否会有客户端接入的提示:如下

        那么第二个客户端的接入传到服务端会被服务端进行一个广播,此时在第一个客户端中是会监听来自服务端的一个广播并打印处理,如下:

6.在第二个客户端输入消息

· 第二个客户端

· 第一个客户端

· 第二个客户端

        收到来自第一个客户端的广播信息 !

7. 下线

        以上就是使用Node中的Net模块对socket通信的一个实现,那么在之后回来将另外一个 WebSocket 实现通信,那么本篇内容就到此结束,感谢大家的支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

充电桩检测设备TK4860E交流充电桩检定装置

产品特点 充电桩检测设备内置5.28 kW单相交流负载,无需携带额外负载进行测试。 宽动态范围测量技术,避免充电桩输出波动引起的测量风险。 ms级电能刷新速度,减少充电桩与标准仪器在非同步累积电能过程中引入的误差,提高累积电能…

【C++11那些事儿(二)】

文章目录一、新的类功能1.1 默认成员函数1.2 强制生成默认函数的关键字default1.3 禁止生成默认函数的关键字delete二、lambda表达式2.1 语法2.2 捕捉列表说明2.3 函数对象与lambda表达式一、新的类功能 1.1 默认成员函数 原来C类中,有6个默认成员函数&#xff1a…

性能测试总结-根据工作经验总结还比较全面

性能测试总结性能测试理论性能测试的策略基准测试负载测试稳定性测试压力测试并发测试性能测试的指标响应时间并发数吞吐量资源指标性能测试流程性能测试工具JMeter基本使用元件构成线程组jmeter的分布式使用jmeter测试报告常用插件性能测试的计算1.根据请求数明细数据计算满足…

【MySQL】多表查询

文章目录🎉多表查询🎈3.1 内连接查询🎈3.2 外连接查询🎈3.3 子查询最后说一句🎉多表查询 🎈3.1 内连接查询 语法 -- 隐式内连接 SELECT 字段列表 FROM 表1,表2… WHERE 条件;-- 显示内连接 SELECT 字段列…

LeetCode 特训 ---- Week1

目录 LeetCode 特训 --- Week1 两数之和 最长回文子串 删除有序数组中的重复项 删除有序数组中的重复项Ⅱ 删除链表中的重复元素 移动0 旋转链表 分隔链表 快慢指针(前后指针)用的好,链表,数组起码轻松打十个。 LeetCode…

videoPictureInPicture,视频画中画播放初探

从Chrome 70版本开始video元素开始支持画中画播放,简单写个demo体验一下 简介 在触发画中画之后视频会始终在右下角悬浮,不论是否在当前标签页或者是浏览器是否最小化。 可以在chrome内看任意视频时点击控制条的画中画按钮即可。 API 文档&#xff1…

人工智能机器人技术概述

移动机器人是一种能够在其环境中移动的自主或半自主机器人系统,通常是通过轮子或履带进行移动。这些机器人旨在在各种环境中执行各种任务,包括探索、监视、检查、运输和操作,包括室内和室外空间、危险区域甚至其他星球。 移动机器人配备传感…

日常记录:天梯赛练习集L1-048 矩阵A乘以B

题目: 给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列,B有Rb​行、Cb​列,则只有Ca​与Rb​相等时,两个矩阵才能相乘。 输入格式&…

【JAVA-模块四 流程控制语句】

JAVA-模块四 流程控制语句一 选择分支语句:if语句if第一种格式:if第二种格式 双分支:if的第三种格式:多条件分支switch多分支:注意:if语句和swich语句如何选择:二 循环语句:2.1 for循…

聚焦弹性问题,杭州铭师堂的 Serverless 之路

作者:王彬、朱磊、史明伟 得益于互联网的发展,知识的传播有了新的载体,使用在线学习平台的学生规模逐年增长,越来越多学生在线上获取和使用学习资源,其中教育科技企业是比较独特的存在,他们担当的不仅仅是…

Mars3D集成到ruoyi管理系统

尽管Mars3d的官网上提供了详尽的文档和API参考手册,但是在集成至ruoyi后天管理系统中时,还是碰到了不少问题: npm安装方式,若只安装mars3d,会提示找不到mars3d-cesium引用cesium相关库的时候,报404错误 这…

MongoDB基础学习总结及SpringBoot项目中的整合

前言 MongoDB 如今是最流行的 NoSQL 数据库之一,被广泛应用于各行各业中,很多创业公司数据库选型就直接使用了 MongoDB。MongoDB一经推出就受到了广大社区的热爱,可以说是对程序员最友好的一种数据库之一,下面主要是笔者在平常的…

大学刚毕业,用10000小时,走进字节跳动拿了offer

前言: 没有绝对的天才,只有持续不断的付出。对于我们每一个平凡人来说,改变命运只能依靠努力幸运,但如果你不够幸运,那就只能拉高努力的占比。 2020年7月,我有幸成为了字节跳动的一名测试开发&#xff0c…

IO流、多线程

FileInputStream FileOutputStream 原理: //1、创建一个FileOutputStream对象,构造方法中写入数据的目的地 FileOutStream fos new FileOutputStream("C:\\a.txt"); //2、调用FileOutputStream对象中的方法write,把数据写入文件中…

【微信小程序】关于实现自定义图片代替checkbox样式的记录

前言 checkbox很好使,使用中往往需要改变它的样式。 记录一下用自定义的图片代替原有样式的过程。 关于把checkbox从:变成的过程 正文 思路 问题拆分: ①如何修改checkbox的样式 ②如何使用图片代替原有样式 如何修改checkbox的样式 修…

氢原子的电子轨道半径、能量、速度

在https://blog.csdn.net/qq_35379989/article/details/130065868?spm1001.2014.3001.5501中我们已经给出了波尔模型的三大假设:定态假设、跃迁假设以及角动量量子化。 一、氢原子的轨道半径 在跃迁假设中,通过设定波尔模型轨道能量:与电子…

各种商业版本的ChatGPT已经推出了,还有必要搞个人的Chat吗?

一、引言 虽然市面上已经存在许多商业版本的ChatGPT交互产品,但在我们的开发中,决定专注于打造一个更加个性化、更贴合个人需求的智能助手。我们相信,每个人都是独一无二的,他们的需求也是各不相同的。因此,个人ChatG…

浅析PHP代码审计中的SQL注入漏洞

浅析PHP代码审计中的SQL注入漏洞1.概述2.普通注入3.编码注入宽字节注入二次urldecode注入4.漏洞防范gpc/rutime魔术引号过滤函数和类addslashes函数mysql_[real_]escape_string函数intval等字符转换PDO prepare预编译1.概述 SQL注入的攻击方式有下面几种: 在权限较…

常用电阻的作用

1、限流: 根据公式:I U / R;可知,电压固定的情况下,电阻越大,电流越小 常用于保护器件, 例如:MCU的输入输出信号线串联电阻,以避免电流过大,损坏元器件 …

快鲸scrm助力眼科机构提效客户运营,提升转化率

眼科机构普遍面临着以下几方面的业务挑战 (1)存在信任危机,用户决策周期长 眼睛是心灵的窗户,患者在对眼部治疗机构的选择上格外慎重,因而决策周期较长,眼科机构需要通过品牌建设、 IP 的打造、优质的产品…