当前位置: 首页 > ops >正文

Rust Web 全栈开发(一):构建 TCP Server

Rust Web 全栈开发(一):构建 TCP Server

  • Rust Web 全栈开发(一):构建 TCP Server
    • 标准库的 std::net 模块
      • TCP 通信
      • UDP 通信
      • 地址表示
    • 新建项目
    • 建立连接
    • 收发数据

Rust Web 全栈开发(一):构建 TCP Server

参考视频:https://www.bilibili.com/video/BV1RP4y1G7KF

标准库的 std::net 模块

std::net 是 Rust 标准库中提供基础、跨平台网络 I/O 功能的核心模块。它主要处理 TCP 和 UDP 协议的通信,提供了同步(阻塞式)的网络操作接口。它是构建网络应用程序的基础,通常用于实现服务器、客户端以及点对点通信。

TCP 通信

TcpStream 代表一个 TCP 连接(客户端或服务器端已建立的连接),提供读写功能。

TcpListener 代表一个 TCP 服务器套接字,绑定到特定地址和端口,监听连接请求。

服务器创建监听套接字,接受来自客户端的连接请求。accept() 返回一个 TcpStream 用于与特定客户端通信。

UDP 通信

UdpSocket 代表一个 UDP 套接字,提供无连接的数据报发送和接收。消息是离散的,不保证顺序、可靠性和到达。

用途:DNS 查询、实时音视频流、游戏状态更新、广播/组播等场景,对延迟敏感但能容忍少量丢包。

地址表示

std::net 提供了表示网络地址的关键类型:IpAddr、Ipv4Addr、Ipv6Addr、SocketAddr,等等。

新建项目

首先用 RustRover 新建一个二进制项目。

修改 Cargo.toml 文件,配置为工作区:

[workspace]

然后再在该目录下新建两个成员包:tcpserver、tcpclient。

cargo new tcpserver
cargo new tcpclient

在这里插入图片描述

在工作区内运行 cargo new 会自动将新创建的包添加到工作区内 Cargo.toml 的 [workspace] 定义中的 members 键中,如下所示:

在这里插入图片描述

此时,我们可以通过运行 cargo build 来构建工作区。项目目录下的文件应该是这样的:

├── Cargo.lock
├── Cargo.toml
├── tcpclient
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── tcpserver
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── target

更多关于工作区的知识,请参考:Rust 学习笔记:Cargo 工作区

建立连接

打开 tcpserver 成员包下的 main.rs,编写代码:

use std::net::TcpListener;fn main() {let listener = TcpListener::bind("127.0.0.1:3000").unwrap();println!("Running on  port 3000 ...");for stream in listener.incoming() {let stream = stream.unwrap();println!("Connection established!");}
}

程序创建了一个监听套接字 listener,监听本地环回地址的 3000 端口。incoming() 方法返回一个迭代器,方便处理多个连接。stream 是一个 TcpStream,可以用于读写数据。

打开 tcpclient 成员包下的 main.rs,编写代码:

use std::net::TcpStream;fn main() {let stream = TcpStream::connect("localhost:3000").unwrap();
}

程序作为客户端发起连接,连接到本地环回地址的 3000 端口。

在终端中输入命令: cargo run -p tcpserver,运行服务端进行监听。

在这里插入图片描述

新建一个终端,在新的终端中输入命令: cargo run -p tcpclient,运行客户端发起连接。

在这里插入图片描述

回到服务端,新打印了一条语句:

在这里插入图片描述

说明服务端监听到了来自客户端的请求,并成功建立了连接。

客户端发起连接后,main 函数就执行完了。但 incoming() 方法不会只接收一次连接就关闭,所以服务端要用 Ctrl + C 强制终止程序。

收发数据

TcpStream 实现了 io::Write、io::Read 两个 trait。

打开 tcpserver 成员包下的 main.rs,修改代码:

use std::io::{Read, Write};
use std::net::TcpListener;fn main() {let listener = TcpListener::bind("127.0.0.1:3000").unwrap();println!("Running on  port 3000 ...");for stream in listener.incoming() {let mut stream = stream.unwrap();println!("Connection established!");let mut buffer = [0; 1024];stream.read(&mut buffer).unwrap();stream.write(&mut buffer).unwrap();}
}

服务端建立连接后,读取 stream 中接收到的内容,存储在 buffer 中。再将 buffer 通过 stream 发送给客户端。

这种从客户端读取内容,再原封不动发送给相同客户端的服务端,一般称为回声(echo)服务端。

打开 tcpclient 成员包下的 main.rs,修改代码:

use std::io::{Read, Write};
use std::net::TcpStream;fn main() {let mut stream = TcpStream::connect("localhost:3000").unwrap();stream.write("Hello, World!".as_bytes()).unwrap();let mut buffer = [0; 13];stream.read(&mut buffer).unwrap();println!("Response from server: {:?}", str::from_utf8(&buffer).unwrap());
}

客户端发送一个字符串给 localhost:3000,再从 stream 中读取内容,并打印出来。

和上一小节一样,在终端中输入命令: cargo run -p tcpserver,运行服务端进行监听。新建一个终端,在新的终端中输入命令: cargo run -p tcpclient,运行客户端发起连接。

在这里插入图片描述

在这里插入图片描述

可以看出,服务端监听端口,实现了回声功能。客户端最终接收到了自己发给客户端的信息。

http://www.xdnf.cn/news/14783.html

相关文章:

  • 新版本没有docker-desktop-data分发 | docker desktop 镜像迁移
  • MYSQL基础内容
  • Django 安装使用教程
  • OpenHarmony 5.0监听导航栏和状态栏是否显示
  • OpenCV CUDA模块设备层-----高效地计算两个uint 类型值的平均值函数vavg2()
  • android核心技术摘要
  • gin框架 中间件 是在判断路由存在前执行还是存在后执行的研究
  • 机器学习:集成学习方法之随机森林(Random Forest)
  • 【Unity】MiniGame编辑器小游戏(九)打砖块【Breakout】
  • 【前端】基础 - HTML基础标签和样式设置
  • 【新手小白的嵌入式学习之路】-STM32的学习_GPIO 8种模式学习心得
  • 第二章AIGC入门:打开人工智能生成内容的新世界大门(3/36)
  • Windows连接L2TP/IPsec 协议 VPN失败
  • QT异步操作
  • Kuikly 与 Flutter 的全面对比分析,结合技术架构、性能、开发体验等核心维度
  • QT初识-实现Hello World(2)
  • Qt Quick 与 QML(五)qml中的布局
  • 运维打铁: 数据加密与备份恢复策略制定
  • 免费版安全性缩水?ToDesk、TeamViewer、向日葵、网易UU远程访问隐私防护测评
  • 【卡尔曼滤波第一期】α−β−γ 滤波器概述
  • [CS创世SD NAND征文] 精准控制的坚固基石:CS创世SD NAND在华大HC32F4A0运动控制卡中的高可靠应用
  • 如何在Excel中每隔几行取一行
  • Foundation 5 安装使用教程
  • 【仿muduo库实现并发服务器】Poller模块
  • Python应用指南:利用高德地图API获取公交+地铁可达圈(二)
  • UE5.6 官方文档笔记 [1]——虚幻编辑器界面
  • Qt_Creator入门基础知识
  • BFD故障检测技术之概述
  • 2025 推理技术风向标:DeepSeek-R1 揭示大模型从 “记忆” 到 “思考” 的进化路径
  • k8s将service的IP对应的不同端口分配到不同的pod上