前段时间小小学习了一下Rust的基础内容,出于学习Web开发的需求,也为巩固学过的Rust基础,就尝试记录一下自己学习 Rust Web 的点滴;
实现环境
OS: Ubuntu 14.0
IDE: PyCharm
本文为个人的学习随记,关于Rust的基础部分没有提及太多,难免出现某些细节上的疏漏,还请读者慎重参考;
目录
Rust Web(一)—— 自建TCP Server
一、项目创建
在自选的位置使用
cargo
创建初始项目,此处命名为pro1
;
进入项目目录,再创建两个子项目,分别为
tcpserver
、tcpclient
;
打开
pro1
中的Cargo.toml
文件,将子项目加入当前的工作空间内,具体如下:
二、TCP Server
进入子项目
tcpserver
,打开src
下 的mian.rs
文件;以下是具体的设计过程:
库引入
引入Rust自带的网络编程库
std::net::TcpListener
监听器绑定
创建一个带有具体
IP:port
绑定的监听实例;
![](https://img-blog.csdnimg.cn/288dfcd1ea4344ac856489b700bde3aa.png)
消息接收
对于消息的接收,可有两种选择:
一种是只接受一次消息后即刻结束运行(实际不常用);
另一种是人为中断除外的无限循环接收,而这类方案是实际设计中更为所用的;
具体实现参考如下
一次性接收
循环接收
-
右式中的
stream
属于std::result::Result<>
类型,因此需要使用unwrap()
进行简约的异常处理;
use std::net::TcpListener;
fn main() {
let listener = TcpListener::bind("127.0.0.1:2333").unwrap();
println!("Running on port 2333...");
for stream in listener.incoming() {
let _stream = stream.unwrap();
println!("Connection established!");
}
}
初步运行
以下是运行的效果;
三、TCP Client
进入子项目
tcpclient
,转到src/main.rs
;具体步骤如下:
库引入
引入Rust自带库
std::net::TcpStream
;创建一个数据流实例来连接指定地址的服务端;
use std::net::TcpStream;
fn main() {
let stream = TcpStream::connect("127.0.0.1:2333").unwrap();
}
运行效果
Client
Server
四、消息收发
由于所引入的网络编程库中实现了读写的 Trait,因此需要引入两个 Trait
std::io::{Read, Write}
TCP消息传送中的读写使用原始字节串形式;
Server
use std::net::TcpListener;
use std::io::{Read, Write};
fn main() {
let listener = TcpListener::bind("127.0.0.1:2333").unwrap();
println!("Running on port 2333...");
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();
}
}
Client
客户端处需要额外进入库
std::str
use std::net::TcpStream;
use std::io::{Read, Write};
use std::str;
fn main() {
let mut stream = TcpStream::connect("127.0.0.1:2333").unwrap();
stream.write("Here's CLient End".as_bytes()).unwrap();
let mut buffer = [0; 17]; // 此处的 17 是为配合消息的长度
stream.read(&mut buffer).unwrap();
println!("Response from server: {:?}",
str::from_utf8(&mut buffer).unwrap() // utf-8编码形式接收
);
}
运行效果
Server
Client
五、项目整体结构
每一个不曾起舞的日子,都是对生命的辜负。