如何创建一个TCP多人聊天室?

news2025/1/18 14:57:06

一、什么是TCP?

TCP(Transmission Control Protocol)是一种可靠的 面向连接的协议 ,可以保证数据在传输过程中不会丢失、重复或乱序。 利用TCP实现简单聊天程序,需要客户端和服务器端之间建立TCP连接,并通过套接字(Socket)进行通信。

二、代码实现:

以下分为客户端和服务器端两个模块,我对这两个模块的每一行代码做了详细解释,如下:

(1)服务器端:

//(1)引入 net 模块: net模块是 Node.js 的一个内置模块,用于创建基于 TCP 的服务器和客户端。 
const net = require('net');
//(2)创建一个 TCP 服务器。此时,服务器还没有开始监听任何端口
const server = net.createServer();
//(3)声明一个数组users用于存储所有已连接的用户的 socket 对象。每当有新的连接进入时,这个数组就会更新。
var users = [];
//(4)当有新的连接进入时,服务器会触发 connection 事件。此时,我们为每一个新的连接创建一个新的 socket 对象。
server.on('connection', (socket) => {
//(5)遍历users来找到每个客户端的socket对象发出消息 一一> 当一个新的连接进入时,我们向所有已连接的用户发送欢迎消息,告诉他们有新的用户(通过其远程端口号 socket.remotePort 标识)加入了聊天室。
    users.forEach(user => { 
        user.write('欢迎' + socket.remotePort + '进入聊天室');
    });
//(6)当从客户端接收到数据时,socket 会触发 data 事件。此时,我们可以处理接收到的数据。
    socket.on('data',(data)=>{
//(7)当从某个 socket 接收到数据时,我们遍历 users 数组并向除了发送该数据的 socket 之外的所有 socket 发送广播。这样,所有的客户端都可以看到其他客户端发送的消息,实现了一个简单的聊天室功能。
        users.forEach(user=>{  //转发
            // 判断是不是自己(本身的客户端) 是就不需要进行信息转发
            if(user!=socket){ //将要发出的消息加工,标明是谁说的
                user.write(socket.remotePort+'说'+data.toString());
            }
        });
    });
//(8)Socket 错误事件监听,捕获错误在控制台上打印出错误的消息
    socket.on('error',(err)=>{
        console.log(err.message);
    });
//(9)Socket 关闭事件监听,触发 close 事件。这个事件监听器在控制台上打印出退出聊天室的客户端的远程端口号,这样我们就可以知道哪个客户端已经断开连接
    socket.on('close',()=>{
        console.log(socket.remotePort+'退出聊天室');
    });
//(10)把socket对象保存到users里面去
    users.push(socket);
});

//(11)服务器错误事件监听,这个事件监听器确保任何服务器启动时的错误都会被捕获并打印出来。
server.on('error', (err) => {
    console.log(err.message);
});
//(12)服务器关闭事件监听,这样我们就可以知道服务器何时被关闭。
server.on('close', () => {
    console.log('聊天室已关闭');
});
//(13)启动服务器并监听端口
server.listen(3000, '127.0.0.1', () => {
    console.log('服务器已启动,监听127.0.0.1:3000');
});

(2)客户端:

客户端程序的主要功能是连接到服务器,将用户的键盘输入发送到服务器,接收并显示来自服务器的响应,同时处理连接过程中的错误和关闭事件
//(1)使用Node.js 内置的 net 模块来与服务器进行网络通信
const net=require('net');
//(2)使用 net.createConnection() 方法来创建一个到指定主机和端口的 TCP 连接。host 参数是 '127.0.0.1',即本地机器的地址,port 参数是 3000,即之前服务器监听的端口
const client=net.createConnection({
    host:'127.0.0.1',
    port:3000
});
//(3)当客户端成功连接到服务器时,会触发 'connect' 事件
client.on('connect',()=>{
//(4)监听连接事件。监听来自标准输入(通常是键盘输入)的 'data' 事件。当用户在命令行中输入数据时,这些数据会被捕获,并通过 client.write() 方法发送到服务器。这里,data.toString() 是为了确保数据以字符串的形式发送
    // 链接成功,准备聊天
    process.stdin.on('data',(data)=>{
        client.write(data.toString());
    })
});
//(5)监听来自服务器的数据。当客户端收到来自服务器的数据时,会触发 'data' 事件。事件处理函数会捕获这些数据,并通过 console.log() 方法将它们打印到控制台上。这里同样使用了 data.toString() 来确保数据以字符串形式被正确处理
client.on('data',(data)=>{
    //将接收到服务器端发过来的消息后通过data.toString()原样输出
    console.log(data.toString());
});
//(6)监听错误事件。如果在与服务器通信过程中发生任何错误 'error' 事件将被触发。事件处理函数会打印出错误消息,帮助我们了解发生了什么错误。
client.on('error',(err)=>{
    console.log(err.message);
});
//(7)监听关闭事件。当客户端与服务器的连接关闭时,会触发 'close' 事件。事件处理函数简单地打印出一条消息,告知用户已经退出了聊天室
client.on('close',()=>{
    console.log('已退出聊天室');
});

三、运行结果如图所示:

打开一个服务器端、两个客户端

两个客户端如图所示:

 当一个客户端退出时,服务器端如图所示:

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

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

相关文章

一条SQL在MySQL中的执行过程

图解: 第⼀步:连接器 过程 1. 建⽴连接:与客户端进⾏ TCP 三次握⼿建⽴连接; 2. 校验密码:校验客户端的⽤户名和密码,如果⽤户名或密码不对,则会报错;3. 权限判断&#xff1a…

HCIP【GRE VPN配置】

目录 实验要求: 实验配置思路: 实验配置过程: 一、按照图式配置所有设备的IP地址 (1)首先配置每个接口的IP地址 (2)配置静态路由使公网可通 二、在公网的基础上创建GRE VPN隧道&#xff0…

【yy讲解PostCSS是如何安装和使用】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

保研线性代数机器学习基础复习2

1.什么是群(Group)? 对于一个集合 G 以及集合上的操作 ,如果G G-> G,那么称(G,)为一个群,并且满足如下性质: 封闭性:结合性:中性…

Linux多进程通信(1)——无名管道及有名管道使用例程

管道是半双工通信,如果需要 双向通信,则需要建立两个管道, 无名管道:只能父子进程间通信,且是非永久性管道通信结构,当它访问的进程全部终止时,管道也随之被撤销 有名管道:进程间不需…

【核弹级软安全事件】XZ Utils库中发现秘密后门,影响主要Linux发行版,软件供应链安全大事件

Red Hat 发布了一份“紧急安全警报”,警告称两款流行的数据压缩库XZ Utils(先前称为LZMA Utils)的两个版本已被植入恶意代码后门,这些代码旨在允许未授权的远程访问。 此次软件供应链攻击被追踪为CVE-2024-3094,其CVS…

从大厂裸辞半年,我靠它成功赚到了第一桶金,如果你失业了,建议这样做,不然时间太久了就完了

程序员接私活和创业是许多技术从业者关注的话题。下面我将介绍一些程序员接私活和创业的渠道和建议: 接私活的渠道: 自媒体平台: 可以利用社交媒体、个人博客、技术社区等平台展示自己的作品和技能,吸引潜在客户。自由工作平台&…

C#(winform) 调用MATLAB函数

测试环境 VisualStudio2022 / .NET Framework 4.7.2 Matlab2021b 参考:C# Matlab 相互调用 Matlab 1、编写Matlab函数 可以没有任何参数单纯定义matlab处理的函数,输出的数据都存在TXT中用以后期读取数据 function [result,m,n] TEST(list) % 计算…

数据分析之Tebleau 的度量名称和度量值

度量名称 包含所有的维度 度量值 包含所有的度量 度量名称包含上面所有的维度,度量值包含上面所有的度量 当同时创建两个或两个以上度量或维度时,会自动创建度量名称和度量值 拖入省份为行(这会是还没有值的) 可以直接将销售金额拖到数值这里 或者将销售…

Kafka 学习之:基于 flask 框架通过具体案例详解生产消费者模型,这一篇文章就够了

文章目录 案例信息介绍后端异步处理请求和后端同步处理请求同步方式异步方式 环境文件目录配置.envrequirements.txt 完整代码ext.pyapp.pykafka_create_user.py 运行方式本地安装 kafka运行 app.py使用 postman 测试建立 http 长连接,等待后端处理结果发送 RAW DAT…

# 达梦数据库知识点

达梦数据库知识点 测试数据 -- SYSDBA.TABLE_CLASS_TEST definitionCREATE TABLE SYSDBA.TABLE_CLASS_TEST (ID VARCHAR(100) NOT NULL,NAME VARCHAR(100) NULL,CODE VARCHAR(100) NULL,TITLE VARCHAR(100) NULL,CREATETIME TIMESTAMP NULL,COLUMN1 VARCHAR(100) NULL,COLUMN…

ARP原理

解析原理 动态ARP通过广播ARP请求和单播ARP应答这两个过程完成地址解析 当需要通信的两台主机处于同一网段时,如上图中的Host_1和Host_3,Host_1要向Host_3发送数据。 首先,Host_1会查找自己本地缓存的ARP表,确定是否包含Host_3对…

精通Go语言文件上传:深入探讨r.FormFile函数的应用与优化

1. 介绍 1.1 概述 在 Web 开发中,文件上传是一项常见的功能需求,用于允许用户向服务器提交文件,如图像、文档、视频等。Go 语言作为一门强大的服务器端编程语言,提供了方便且高效的方式来处理文件上传操作。其中,r.F…

155 Linux C++ 通讯架构实战10,工具telent 和 wireshark的使用

telnet工具使用介绍 windows 上开启telnet linux 上开始telnet 使用telnet //是一款命令行方式运行的客户端TCP通讯工具,可以连接到服务器端,往服务器端发送数据,也可以接收从服务器端发送过来的信息; //类似nginx5_1_1_clie…

IO流c++

IO流类库 输入输出流 #include <iostream> using namespace std;class InCount { public:InCount(int a 0, int b 0){c1 a;c2 b;}void show(void){cout << "c1" << c1 << "\t" << "c2" << c2 << …

Go 语言学习一篇入门

Goloang的优缺点 Goloang的优点 极其简单的部署方式 可直接编译成机器码不依赖其他库直接运行即可部署 语言层面的并发 天生的基因支持充分的利用多核 强大的标准库 runtime 系统调度机制高效的GC垃圾回收丰富的标准库 Goloang的不足 包管理&#xff0c;大部分包都在g…

MultiPath HTTP:北大与华为合作部署FLEETY

当前的终端基本都能支持蜂窝网络和wifi网络&#xff0c;然而&#xff0c;不同的网络通路都不可避免的会出现信号不好或者其他因素引起的通路性能(吞吐量、时延等)下降。为了能够提升终端业务体验&#xff0c;很多不同的MultiPath方案被提出&#xff0c;其中&#xff0c;包括应用…

(文章复现)考虑分布式电源不确定性的配电网鲁棒动态重构

参考文献&#xff1a; [1]徐俊俊,吴在军,周力,等.考虑分布式电源不确定性的配电网鲁棒动态重构[J].中国电机工程学报,2018,38(16):4715-47254976. 1.摘要 间歇性分布式电源并网使得配电网网络重构过程需要考虑更多的不确定因素。在利用仿射数对分布式电源出力的不确定性进行合…

Decoupled Multimodal Distilling for Emotion Recognition 论文阅读

Decoupled Multimodal Distilling for Emotion Recognition 论文阅读 Abstract1. Introduction2. Related Works2.1. Multimodal emotion recognition2.2. Knowledge distillation3. The Proposed Method3.1. Multimodal feature decoupling3.2. GD with Decoupled Multimodal …

【Gd2O3】Gd2O3栅极电介质增强GaN器件的可靠性

【Effects of Gd2O3 Gate Dielectric on Proton-Irradiated AlGaN/GaN HEMTs】 概括总结&#xff1a; 该研究探讨了质子辐射对使用Gd2O3作为栅极电介质的AlGaN/GaN高电子迁移率晶体管&#xff08;HEMTs&#xff09;的影响。通过对比肖特基栅极HEMTs和MOS-HEMTs在2 MeV质子辐射…