rust自创服务器_用Rust写了一个简单的Web服务器
Rust
最近学了一阵Rust,这个语言的目的是系统编程,卖点是无GC的内存安全。为了实现这一点,Rust引入了所有权、借用、生命周期的概念。可以在编译器检查出可能的内存问题,如野指针、局部变量指针等等。不过这也对写程序造成了一定的困扰,对于move、borrow等如果理解的不是很到位,那必然要和编译器做长期的斗争。
Web服务器
骨架
Web服务器,实际上就是对socket的数据流的处理,监听端口,并对每个新的连接,开启一个新的线程进行处理。代码的骨架基本上是
matchTcpListener::bind("127.0.0.1",9999)){Ok(listener)=>{forstreaminlistener.incoming(){matchstream{Err(e)=>{// error, log, ignore},Ok(s)=>{thread::spawn(move||handle_client(s));},}}drop(listener);},Err(e)=>{// error, log, ignore}}
其中thread::spawn(move || handle_client(s)),开启新的线程,参数是一个闭包,move关键字表示将闭包所在环境的标量的所有权强行交给闭包。之后重点是handle_client中对于TcpStream的处理,也就是解析请求,并构造响应。读取请求。
解析请求
一个HTTP的请求,格式是这样的
METHOD URI VERSION
Host: xxx
other-header: xxx
body
这个服务器目前只能处理GET和HEAD请求,并且只能处理静态文件,所有很多东西并没有做。比如querystring的解析、请求体的解析等等。各种header也只是解析,并没有真的使用。之后会慢慢完善,函数重点是
fn parse(stream: &mutTcpStream)-> Option{letmuts=Vec::new();Self::get_request(stream,&muts);matchString::from_utf8(s){Ok(s)=>{// parse request line and header},Err(_)=>None,}}
如果解析失败,返回一个None,这是Request结构的一个静态方法。解析成功则打印日志,并根据请求构造响应。
构造响应
响应的的格式为
VERSION CODE PHRASE
header: xxx
other-header: xxx
body
由于只能处理静态请求,实际上这里就是读取文件并.对于HEAD请求,只计算长度,没有响应体部分。
目前的相应的结构为
struct Response{head: String,body: String
}
通过code、mime、content等拼接字符串,得到响应头部以及响应体。最后通过TcpStream发送出去。
至此,这个web服务器就算是完成了。
最后
Rust这个语言还是非常不熟,对于lifetime的理解也太行,所以通篇没有用到lifetime标记,遇到字符串都是用的String。另外,Rust目前并没有高性能的非阻塞IO以及异步IO,有一些库在做这方面的尝试。不过对这方面不熟,没有多做尝试。
rust自创服务器_用Rust写了一个简单的Web服务器相关推荐
- ios php mysql实例_如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1
原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...
- ipad php mysql_如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1
原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...
- 用python写一个简单的web服务器
人生苦短,我用python 简洁高效,这才是理想的语言啊 分享一点python的学习经验-----如何用python写一个简单的web服务器 首先,我们需要简单地了解一下网络通信协议,这里用白话介绍一 ...
- 如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1
原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...
- web服务器python_一个简单的web服务器(python)
今天用python写一个简单的web服务器代码网上都有只是为了方便大家学习做了一个简单的教程 第一首先我们来一张架构以及运行过程的流程图 本文学习仅供参考,需要更多资料可以加群:496257369 简 ...
- 我的Go语言学习之旅八:创建一个简单的WEB服务器
因为一直在做WEB程序,所以更关注WEB界的发展,这里就用GO做了一个简单的WEB服务器,直接看例子吧 package main import ( "fmt" "net/ ...
- java实现web服务器_Java 实现一个简单的web服务器
在日常的开发中,我们用过很多开源的web服务器,例如tomcat.apache等等.现在我们自己实现一个简单的web服务器,基本的功能就是用户点击要访问的资源,服务器将资源发送到客户端的浏览器.web ...
- 【计算机网络作业】Java UDP聊天 和 Socket编写一个简单的Web服务器
1-1 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序.具体如下: (1).Tom和Jerry聊天的双方都应该具有发送端和接收端: (2).利用DatagramSocket与Da ...
- c语言服务器制作,C语言写的简易实用的web服务器
码农公社 210.net.cn 210是何含义?10月24日是程序员节,1024 =210.210既 210 之意. Apache在码农界是比较知名的,它也是目前最接地气.使用最广泛的Web服务器 ...
最新文章
- python socket recvfrom_Python socket学习笔记(一)
- 成大事必备9种能力 9种手段 9种心态(图)
- 用神经网络例子讲解TF运行方式~人工智能入门编程例子讲解
- 进程间通信(未完成)
- CSDN九年的博客时光
- Linux静态库与动态库详解
- 千万不能返回局部变量的引用
- 成功解决gyp verb ensuring that file exists: C:\Python27\python.exe gyp ERR! configure error gyp ERR! sta
- SQL查询分析器单文件绿色版
- 微信网页版协议今天关闭,新的微信协议 HOOK技术
- GEE开发之Landsat_SR计算地表温度(不推荐)
- 首都师范 博弈论 5 2 1帕累托最优
- html语言文本框怎么做,HTML文本框参考样式
- 和平精英显示与服务器断开连接,和平精英网络异常怎么办 网络异常解决方法...
- 写好的java项目如何部署在公司服务器上,并能让局域网内其他同事访问到,以及遇到的坑!
- 阿里云服务器被攻击了
- 线性规划以及二次规划
- Matplotlib_Study01
- windows服务器署站点,Windows Server配置学习心得-web服务器的搭建和部署,配置一个BLOG站点...
- 学习廖雪峰Git入门教程--总结
热门文章
- coreldraw怎么打印荣誉证书_CorelDraw如何批量打印证书
- System.InvalidOperationException: Response Content-Length mismatch: too few bytes written (0 of 1628
- 内网渗透----Windows下信息收集
- 小米手机开发者选项打开usb安装需要SIM卡解决办法
- HTML+css简单实现手机邮箱导航网页
- Linux 压缩、解压、打包操作
- 云谦:谈谈前端框架的趋势与实践
- html实现微信公众号,H5在微信公众号的下拉刷新实现
- 北鲲云联合珠海中科先进技术研究院推出代算服务
- zabbix的php最低版本,ZABBIX企业监控实践(3):升级与配置PHP