 个人主页:空白诗

文章目录

 引言 基础认知概览 TCP - 稳健的信使 ️ UDP - 敏捷的使者 ‍♂️

六‍ 实战演练:代码示例TCP 服务器与客户端 示例服务器(Node.js)客户端(Node.js)

UDP 服务器与客户端 示例服务器(Node.js)客户端(Node.js)

 总结 相关链接

 引言

在互联网的广阔天地里,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)作为传输层的两大支柱,各自承担着不同的使命。下面这篇文章将带你从基础到进阶,全面解析它们的特点、差异及应用场景,同时通过实战代码加深理解。

 基础认知概览

 TCP - 稳健的信使 ️

TCP,一个面向连接的协议,就像是互联网世界里的忠诚邮递员,确保每一份数据都能安全、准确地送达目的地。

握手 欄:TCP连接建立前会通过三次握手确保双方准备就绪。可靠性 :提供数据确认、重传机制,确保数据完整无缺,顺序传输。流量控制 :通过滑动窗口机制调节数据发送速率,避免接收方过载。拥塞控制 :动态调整数据发送量,缓解网络拥堵。应用场景 :适合文件传输、网页浏览等需要高度可靠性的场景。

 UDP - 敏捷的使者 ‍♂️

UDP,一个无连接的协议,更像是一位奔跑的快递员,快速但不保证包裹的最终到达状态。

快速传输 :无需建立连接,直接发送数据包,降低延迟。轻量级 襁:头部简单,减少网络传输的开销。不保证顺序和完整性 :数据可能丢失、乱序,但适用于对实时性要求高的场景。多播支持 :能够实现一对多的高效数据分发。应用场景 :适用于视频会议、在线游戏、DNS查询等实时性优先的场景。

六‍ 实战演练:代码示例

TCP 服务器与客户端 示例

服务器(Node.js)

const net = require('net');

// 创建TCP服务器

const server = net.createServer((socket) => {

// 每当有新的连接建立时,这个回调函数会被执行,socket代表与客户端的连接

console.log('A client connected.');

// 为这个socket(即与单个客户端的连接)添加'data'事件监听器

socket.on('data', (data) => {

// 当接收到客户端发送的数据时,这个事件被触发

console.log(`Received: ${data}`);

// 将接收到的数据原样回传给客户端

socket.write(`Echo: ${data}`);

});

// 可以在这里添加更多的事件处理,比如处理连接结束('end')、错误('error')等

});

// 使服务器开始监听指定端口(这里是3000端口)

server.listen(3000, () => {

console.log('TCP Server listening on port 3000');

// 这个回调函数在服务器开始监听后执行,打印一条消息表明服务器已启动并监听指定端口

});

客户端(Node.js)

const net = require('net');

// 定义服务器的IP地址和端口号

const SERVER_HOST = 'localhost'; // 如果服务器与客户端在同一台机器上,可以使用localhost或127.0.0.1

const SERVER_PORT = 3000; // 确保这个端口号与TCP服务器监听的端口一致

// 创建一个新的TCP客户端Socket实例

const client = new net.Socket();

// 连接到指定的服务器和端口

client.connect(SERVER_PORT, SERVER_HOST, () => {

// 连接成功后的回调函数

console.log('Connected to server'); // 打印提示信息,表明已成功连接到服务器

// 定义要发送给服务器的消息

const message = 'Hello, TCP Server!';

// 使用write方法将消息发送给服务器

client.write(message); // 实际发送消息

// 可选:监听'data'事件以接收服务器的响应

client.on('data', (data) => {

console.log('Received:', data.toString()); // 接收到服务器数据时打印出来

// client.end(); // 可以在此处选择关闭连接,根据实际应用需求决定

});

// 监听'end'事件,当连接结束时触发

client.on('end', () => {

console.log('Connection closed'); // 打印提示信息,表示连接已关闭

});

// 监听'error'事件,处理连接或数据传输过程中的错误

client.on('error', (err) => {

console.error('Error:', err); // 打印错误信息

client.destroy(); // 遇到错误时关闭Socket,释放资源

});

});

UDP 服务器与客户端 示例

服务器(Node.js)

// 导入Node.js的dgram模块,用于创建UDP通信的socket

const dgram = require('dgram');

// 使用dgram模块创建一个UDP服务器socket,指定使用IPv4协议

const server = dgram.createSocket('udp4');

// 为UDP服务器socket添加'message'事件监听器

// 当有UDP数据包从客户端发送到服务器时,该事件被触发

server.on('message', (msg, rinfo) => {

// msg参数是接收到的数据内容,rinfo是一个对象,包含发送方的信息

// rinfo.address是发送方的IP地址,rinfo.port是发送方的端口号

// 打印接收到的消息内容及发送方的地址和端口信息

console.log(`UDP message: ${msg} from ${rinfo.address}:${rinfo.port}`);

});

// 让UDP服务器socket开始监听指定端口(这里是4000端口)

// 第二个参数是回调函数,当服务器开始监听后执行

server.bind(4000, () => {

// 打印日志,表明UDP服务器已在指定端口成功启动并开始监听

console.log('UDP Server listening on port 4000');

});

客户端(Node.js)

// 导入dgram模块,这是Node.js中用于创建UDP Socket的模块

const dgram = require('dgram');

// 创建一个UDP客户端Socket,指定使用IPv4协议

const client = dgram.createSocket('udp4');

// 使用客户端Socket发送消息到指定的服务器

// 参数分别是:要发送的数据(必须是Buffer或字符串)、服务器端口号、服务器地址、回调函数处理错误

client.send('Hello, UDP Server!', 4000, 'localhost', (err) => {

// 如果发送过程中发生错误,则抛出异常

if (err) throw err;

// 打印日志,表明消息已成功发送

console.log('UDP message sent');

});

// 为客户端Socket添加'message'事件监听器,用于接收服务器的响应

client.on('message', (msg, rinfo) => {

// 打印接收到的消息内容以及发送方的地址和端口

console.log(`UDP response: ${msg} from ${rinfo.address}:${rinfo.port}`);

});

// 监听'listening'事件,当客户端Socket准备好接收数据时触发

// (注意:UDP客户端通常不直接监听,此段代码更多是演示,实际中UDP客户端不需监听listening事件)

client.on('listening', () => {

// 获取客户端Socket的地址信息

const address = client.address();

// 打印客户端的监听地址和端口,尽管UDP客户端不真正“监听”,此处逻辑更多是概念演示

console.log(`UDP Client listening on ${address.address}:${address.port}`);

});

 总结

TCP和UDP各有千秋,TCP以其可靠性成为大多数需要确保数据安全传输场景的首选,而UDP凭借其快速、轻量的优势,在实时通信领域大放异彩。

选择合适协议的关键在于理解应用的具体需求:是追求数据的准确无误,还是强调速度与实时性?希望这篇笔记能帮助你在未来的开发之旅中,更加自信地驾驭这两种强大的工具。

 相关链接

WebSocket 实战案例: WebSocket 全面解析——简易聊天室

文章来源

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。