Rust Web(一)—— 自建TCP Server

2023-05-16

  • 前段时间小小学习了一下Rust的基础内容,出于学习Web开发的需求,也为巩固学过的Rust基础,就尝试记录一下自己学习 Rust Web 的点滴;

  • 实现环境

    • OS: Ubuntu 14.0

    • IDE: PyCharm

  • 本文为个人的学习随记,关于Rust的基础部分没有提及太多,难免出现某些细节上的疏漏,还请读者慎重参考;

目录

Rust Web(一)—— 自建TCP Server

一、项目创建

二、TCP Server

库引入

监听器绑定

消息接收

初步运行

三、TCP Client

库引入

运行效果

四、消息收发

Server

Client

运行效果

五、项目整体结构


Rust Web(一)—— 自建TCP Server

一、项目创建


  • 在自选的位置使用 cargo 创建初始项目,此处命名为pro1

  • 进入项目目录,再创建两个子项目,分别为tcpservertcpclient

  • 打开pro1中的Cargo.toml文件,将子项目加入当前的工作空间内,具体如下:

二、TCP Server


  • 进入子项目tcpserver,打开src下 的mian.rs文件;

  • 以下是具体的设计过程:

库引入

  • 引入Rust自带的网络编程库 std::net::TcpListener

监听器绑定

  • 创建一个带有具体IP:port绑定的监听实例;

绑定监听器

消息接收

对于消息的接收,可有两种选择:

  • 一种是只接受一次消息后即刻结束运行(实际不常用);

  • 另一种是人为中断除外的无限循环接收,而这类方案是实际设计中更为所用的;

具体实现参考如下

一次性接收

循环接收

  • 右式中的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

五、项目整体结构


每一个不曾起舞的日子,都是对生命的辜负。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust Web(一)—— 自建TCP Server 的相关文章

随机推荐

  • 有用的samba配置文件

    span class token punctuation span guxinhua span class token punctuation span span class token assign left variable path
  • redha笔记本最小安装,打开wifi,搭建gitlab

    打开wifi yum span class token function install span NetworkManager systemctl start NetworkManager dispatcher service yum s
  • Ubuntu 16.04登录后进入蓝屏的解决措施

    今天启动Ubuntu 16 04系统后 xff0c 在显示登录界面时 xff0c 颜色和平时相比更加暗淡一些 xff0c 输入密码后 xff0c 一直停留在蓝屏界面 xff08 我当时没有拍照 xff0c 借用网上一张图片说明 xff0c
  • gitlab通过令牌获取issue,写入xls

    1 xff1a 创建令牌 在设置里面创建 2 xff1a 根据项目和用户名发送curl命令测试 xff1a curl header PRIVATE TOKEN glpat R N9x4ssboy5 ti7RyjC http 192 168
  • VMware虚拟机安装centos7,第一次登录时输入正确的密码仍提示抱歉,没有工作,请再试一遍

    使用VMware虚拟机安装centos7 xff0c 首次登录时已经输入了正确的密码仍然提示 34 sorry that didn t work please try again 34 输入密码时使用物理键盘 xff08 有的说输入数字时要
  • Day_01_服务器硬件常识与redhat环境基础配置

    服务器的应用场景 常见的三种文件共享服务 xff1a SMB FTP CMS 数据库 xff1a 管理和使用 xff0c 增删改查 xff0c 授权 xff0c 改授权 邮件 xff1a 正式的沟通交流都是以邮件通知为主 web serve
  • Java基本数据类型

    四大类 1 整型 byte short int long 2 浮点型 float double 3 字符型 char 4 布尔型 boolean
  • 自动拆装箱

    自动装箱就是Java自动将原始类型值转换成对应的对象 xff0c 比如将int的变量转换成Integer对象 xff0c 这个过程叫做装箱 xff0c 反之将Integer对象转换成int类型值 xff0c 这个过程叫做拆箱 因为这里的装箱
  • string为会么不可变,String、StringBuilder、StringBuffer的区别

    String 类中使用 final 关键字字符数组保存字符串 xff0c 所以 String 对象是不可变的 而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类 xff0c
  • JAVA IO流

    IO常用类 文件流 xff1a FileInputStream FileOutputStream xff0c FileReader FileWriter 这四个类是专门操作文件流的 xff0c 用法高度相似 xff0c 区别在于前面两个是操
  • JAVA反射

    JAVA反射机制是在运行状态中 xff0c 对于任意一个类 xff0c 都能够知道这个类的所有属性和方法 xff1b 对于任意一个对象 xff0c 都能够调用它的任意一个方法和属性 xff1b 这种动态获取的信息以及动态调用对象的方法的功能
  • java 哪些源码需要细看

    String Integer Long Enum Big ThreadLocal CloseLoader ArrayList amp LinkedLis Map HashMap Set
  • 算法中时间复杂度概括——o(1)、o(n)、o(logn)、o(nlogn)

    O后面的括号中作为一个函数 xff0c 指明某个算法的耗时 耗空间与数据增长量之间的关系 其中的n代表输入数据的量 比如时间复杂度为O n xff0c 就代表数据量增大几倍 xff0c 耗时也增大几倍 比如常见的遍历算法 再比如时间复杂度O
  • 怎么禁止/开启Ubuntu自动更新升级

    当你打开Ubuntu系统时经常会弹出软件更新升级提示框 xff0c 因为Ubuntu包括上面装的很多软件也都是开源系统 xff0c 更新升级是很频繁的 xff0c 对于经常弹出的更新提示无非是两种应对措施 xff0c 要么安装 xff0c
  • 六大设计模式

    单一职责 开闭原则 李氏替换原则 LSP 门面的实现 依赖倒转原则 DIP 服务指向契约 契约绑定实现 接口隔离原则 ISP 接口对应一种角色 最少知道原则 类之间的弱耦合 需要反复度量
  • centos安装jdk

    1 下载自己系统对应版本 2 到该文件所在目录执行命令 rpm ivh jdk 8u221 linux x64 rpm 3 默认安装在 usr java jdk1 8 0 221 amd64目录下 4 环境变量配置 xff1a cd etc
  • ESC上搭建spring boot

    一 打包项目 a 单击IDEA右上角Maven b 依次双击 demo gt Lifecycle gt package xff0c 开始打包 执行结果如下 xff0c 图中标记位置为打包后jar包的路径 二 运行ECS上的Java项目 执行
  • win10 安装配置mysql8

    1 下载 https tomcat apache org 选择自己需要的版本 2解压 3配置环境变量 略 4配置my ini 在 MYSQL HOME 下新建my int文件 xff0c 内容如下 span class token punc
  • idea调用javap

    idea 配置javap 具体参数设置如下 program span class token variable JDKPath span span class token punctuation span bin span class to
  • Rust Web(一)—— 自建TCP Server

    前段时间小小学习了一下Rust的基础内容 xff0c 出于学习Web开发的需求 xff0c 也为巩固学过的Rust基础 xff0c 就尝试记录一下自己学习 Rust Web 的点滴 xff1b 实现环境 OS Ubuntu 14 0 IDE