陈天 · Rust 编程第一课
陈天
Tubi TV 研发副总裁
23195 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
基础篇 (21讲)
陈天 · Rust 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

28|网络开发(上):如何使用Rust处理网络请求?

其他辅助结构:IpAddr, SocketAddr
UDP/UdpSocket
TCP/TcpListener/TcpStream
继续学习网络开发的通讯模型
使用async_prost::AsyncProstStream改写kv server的示例代码
使用LengthDelimitedCodec处理自定义协议的示例代码
使用protobuf自定义协议
使用已有的应用层协议处理网络数据
处理共享信息的方法
使用协程来处理大量连接
处理大量连接的问题
处理TCP连接的示例代码
std::net
Rust生态对网络协议的支持
ISO/OSI七层模型
Web开发和涉及的协议
下一讲预告
思考题
处理网络数据的一般方法
处理网络连接的一般方法
使用Rust标准库处理网络连接
网络开发概述
网络开发(上):如何使用Rust处理网络请求?

该思维导图由 AI 生成,仅供参考

你好,我是陈天。今天我们学习如何使用 Rust 做网络开发。
在互联网时代,谈到网络开发,我们想到的首先是 Web 开发以及涉及的部分 HTTP 协议和 WebSocket 协议。
之所以说部分,是因为很多协议考虑到的部分,比如更新时的并发控制,大多数 Web 开发者并不知道。当谈论到 gRPC 时,很多人就会认为这是比较神秘的“底层”协议了,其实只不过是 HTTP/2 下的一种对二进制消息格式的封装。
所以对于网络开发,这个非常宏大的议题,我们当然是不可能、也没有必要覆盖全部内容的,今天我们会先简单聊聊网络开发的大全景图,然后重点学习如何使用 Rust 标准库以及生态系统中的库来做网络处理,包括网络连接、网络数据处理的一些方法,最后也会介绍几种典型的网络通讯模型的使用。
但即使这样,内容也比较多,我们会分成上下两讲来学习。如果你之前只关注 Web 开发,文中很多内容读起来可能会有点吃力,建议先去弥补相关的知识和概念,再学习会比较容易理解。
好,我们先来简单回顾一下 ISO/OSI 七层模型以及对应的协议,物理层主要跟 PHY 芯片有关,就不多提了:
七层模型中,链路层和网络层一般构建在操作系统之中,我们并不需要直接触及,而表现层和应用层关系紧密,所以在实现过程中,大部分应用程序只关心网络层、传输层和应用层
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了如何使用Rust处理网络请求的相关内容。首先回顾了ISO/OSI七层模型以及对应的协议,然后介绍了Rust生态对网络协议的支持,包括标准库提供的std::net和异步网络运行时tokio。接着详细介绍了在Rust中处理TCP和UDP的方法,以及处理大量连接和共享信息的技术挑战和解决方案。文章强调了在处理网络连接时需要注意避免阻塞主循环,以及在构建服务器时需要考虑共享状态的处理方式。最后,文章提到了突破C10K瓶颈和处理共享信息的方法,包括使用异步网络运行时和合理处理共享资源的访问方式。整体而言,本文以Rust为工具,深入浅出地介绍了网络开发的相关知识和技术要点,适合对网络开发感兴趣的读者阅读学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《陈天 · Rust 编程第一课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • 罗杰
    Protobuf 和二进制数据解析都是我一直在寻找的,非常赞

    作者回复: 👍

    2021-11-01
    5
  • springXu
    请教要实现socks5的服务程序,您建议用什么库?为什么推荐这个?

    作者回复: 没有尝试过,你可以在 crates.io 中查找:https://crates.io/keywords/socks5。然后看看各自的使用情况,更新情况。一般我会考虑和已有生态结合更好的,更新频繁,github/gitlab 高赞的库。对于小众的库我会简单对比尝试一下是否满足需求,甚至会根据需要简单浏览一下源代码。

    2021-11-02
    2
    2
  • dva
    试着做一下思考题 use anyhow::Result; use async_prost::AsyncProstStream; use futures::prelude::*; use kv1::{CommandRequest, CommandResponse, Service, ServiceInner, SledDb}; use tokio::net::TcpListener; use tracing::info; use bytes::Bytes; use futures::{SinkExt, StreamExt}; use tokio_util::codec::{Framed, LengthDelimitedCodec}; use prost::Message; #[tokio::main] async fn main() -> Result<()> { tracing_subscriber::fmt::init(); let service: Service<SledDb> = ServiceInner::new(SledDb::new("/tmp/kvserver")) .fn_before_send(|res| match res.message.as_ref() { "" => res.message = "altered. Original message is empty.".into(), s => res.message = format!("altered: {}", s), }) .into(); let addr = "127.0.0.1:9527"; let listener = TcpListener::bind(addr).await?; loop { let (stream, addr) = listener.accept().await?; println!("accepted: {:?}", addr); // LengthDelimitedCodec 默认 4 字节长度 let mut stream = Framed::new(stream, LengthDelimitedCodec::new()); let svc = service.clone(); tokio::spawn(async move { // 接收到的消息会只包含消息主体(不包含长度) while let Some(Ok(data)) = stream.next().await { let cmd = CommandRequest::decode(data).unwrap(); info!("req: {:?} ", cmd); let res = svc.execute(cmd); info!("res: {:?} ", res); stream.send(Bytes::from(res.encode_to_vec())).await.unwrap(); } }); } }

    作者回复: 👍

    2021-11-29
    1
  • 进击的Lancelot
    思考题可以参考 dva 同学的实现,我这里也提供一个关于 client 的修改: ```rust use anyhow::Result; use bytes::Bytes; use futures::prelude::*; use kv::CommandRequest; use prost::Message; use tokio::net::TcpStream; use tokio_util::codec::{Framed, LengthDelimitedCodec}; use tracing::info; #[tokio::main] async fn main() -> Result<()> { tracing_subscriber::fmt().init(); let addr = "127.0.0.1:9527"; let stream = TcpStream::connect(addr).await?; let mut client = Framed::new(stream, LengthDelimitedCodec::new()); let cmd = CommandRequest::new_hset("table1", "hello", "world".into()); client.send(Bytes::from(cmd.encode_to_vec())).await?; if let Some(Ok(data)) = client.next().await { info!("Got response: {:?}", data); } Ok(()) } ```
    2022-09-16归属地:广东
    3
  • 贱猴🐔哥的室友
    之前以为protobuf必须和grpc等一起用比较好,发现自定义的格式其实跟 TLV(Type-Length-Value)是一样的原理,而且更简单,这种方式应该比较好
    2022-10-10归属地:美国
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部