diff --git a/book/contents/SUMMARY.md b/book/contents/SUMMARY.md
index a1f6b02a..9d65e075 100644
--- a/book/contents/SUMMARY.md
+++ b/book/contents/SUMMARY.md
@@ -79,6 +79,7 @@
- [线程同步:锁、Condvar和信号量](advance/concurrency-with-threads/sync1.md)
- [线程同步:Atomic原子操作与内存顺序](advance/concurrency-with-threads/sync2.md)
- [基于Send和Sync的线程安全](advance/concurrency-with-threads/send-sync.md)
+ - [实践应用:多线程Web服务器 todo](advance/concurrency-with-threads/web-server.md)
- [Unsafe Rust todo](advance/unsafe/intro.md)
- [原生指针 todo](advance/unsafe/raw-pointer.md)
- [FFI外部语言用 todo](advance/unsafe/ffi.md)
@@ -98,7 +99,7 @@
- [async、await和Stream流处理](async/async-await.md)
- [同时运行多个Future](async/multi-futures-simultaneous.md)
- [一些疑难问题的解决办法](async/pain-points-and-workarounds.md)
- - [HTTP Client/Server todo](async/http.md)
+ - [实践应用:Async Web服务器](async/web-server.md)
- [tokio todo](async/tokio/intro.md)
- [基本用法](async/tokio/basic.md)
- [异步消息流](async/tokio/stream.md))
@@ -142,11 +143,6 @@
- [进阶类型转换](converse/intro.md)
- [枚举和整数](converse/enum-int.md)
-- [用Rust增强Javascript todo](rustjs/intro.md)
- - [deno todo](rustjs/deno.md)
- - [wasm tod](rustjs/wasm/intro.md)
-
-
- [复杂错误索引 todo](errorindex/intro.md)
- [所有权和借用 todo](errorindex/borrowing/intro.md)
- [生命周期 todo](errorindex/lifetime/intro.md)
@@ -227,13 +223,6 @@
- [HashMap todo](std/hashmap.md)
- [Iterator常用方法 todo](std/iterator.md)
-- [常用三方库 todo](libraries/intro.md)
- - [JSON](libraries/json/intro.md)
- - [serde(todo)](libraries/json/serde.md)
- - [HTTP](libraries/http/intro.md)
- - [reqwest(todo)](libraries/http/reqwest.md)
- - [命令行解析](libraries/command/intro.md)
- - [structopt(todo)](libraries/command/structopt.md)
## 附录
- [附录](appendix/intro.md)
diff --git a/book/contents/advance/concurrency-with-threads/web-server.md b/book/contents/advance/concurrency-with-threads/web-server.md
new file mode 100644
index 00000000..6d684f09
--- /dev/null
+++ b/book/contents/advance/concurrency-with-threads/web-server.md
@@ -0,0 +1 @@
+# 实践应用:多线程Web服务器 todo
diff --git a/book/contents/async/future/workarounds.md b/book/contents/async/future/workarounds.md
deleted file mode 100644
index 92515146..00000000
--- a/book/contents/async/future/workarounds.md
+++ /dev/null
@@ -1 +0,0 @@
-# 遇到不支持的异步特性? todo
diff --git a/book/contents/async/http.md b/book/contents/async/http.md
deleted file mode 100644
index 087b4c31..00000000
--- a/book/contents/async/http.md
+++ /dev/null
@@ -1 +0,0 @@
-# HTTP Client/Server
diff --git a/book/contents/async/web-server.md b/book/contents/async/web-server.md
new file mode 100644
index 00000000..8baf6133
--- /dev/null
+++ b/book/contents/async/web-server.md
@@ -0,0 +1,314 @@
+# 一个实践项目: Web服务器
+知识学得再多,不实际应用也是纸上谈兵,不是忘掉就是废掉,对于技术学习尤为如此。在之前章节中,我们已经学习了 `Async Rust` 的方方面面,现在来将这些知识融会贯通,最终实现一个并发Web服务器。
+
+## 多线程版本的Web服务器
+在正式开始前,先来看一个单线程版本的 `Web` 服务器,该例子来源于 [`Rust Book`](https://doc.rust-lang.org/book/ch20-01-single-threaded.html) 一书。
+
+`src/main.rs`:
+```rust
+use std::fs;
+use std::io::prelude::*;
+use std::net::TcpListener;
+use std::net::TcpStream;
+
+fn main() {
+ // 监听本地端口 7878 ,等待 TCP 连接的建立
+ let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+
+ // 阻塞等待请求的进入
+ for stream in listener.incoming() {
+ let stream = stream.unwrap();
+
+ handle_connection(stream);
+ }
+}
+
+fn handle_connection(mut stream: TcpStream) {
+ // 从连接中顺序读取 1024 字节数据
+ let mut buffer = [0; 1024];
+ stream.read(&mut buffer).unwrap();
+
+ let get = b"GET / HTTP/1.1\r\n";
+
+
+ // 处理HTTP协议头,若不符合则返回404和对应的`html`文件
+ let (status_line, filename) = if buffer.starts_with(get) {
+ ("HTTP/1.1 200 OK\r\n\r\n", "hello.html")
+ } else {
+ ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html")
+ };
+ let contents = fs::read_to_string(filename).unwrap();
+
+ // 将回复内容写入连接缓存中
+ let response = format!("{status_line}{contents}");
+ stream.write_all(response.as_bytes()).unwrap();
+ // 使用flush将缓存中的内容发送到客户端
+ stream.flush().unwrap();
+}
+```
+
+`hello.html`:
+```rust
+
+
+
+
+ Hello!
+
+
+ Hello!
+ Hi from Rust
+
+
+```
+
+`404.html`:
+```rust
+
+
+
+
+ Hello!
+
+
+ Oops!
+ Sorry, I don't know what you're asking for.
+
+
+```
+
+运行以上代码,并从浏览器访问 `127.0.0.1:7878` 你将看到一条来自 `Ferris` 的问候。
+
+在回忆了单线程版本该如何实现后,我们也将进入正题,一起来实现一个基于 `ascyn` 的异步Web服务器。
+
+## 运行异步代码
+一个 Web 服务器必须要能并发的处理大量来自用户的请求,也就是我们不能在处理上一个用户的请求后,再处理下一个用户的请求。上面的单线程版本可以修改为多线程甚至于线程池来实现并发处理,但是线程还是太重了,使用 `async` 实现 `Web` 服务器才是最适合的。
+
+首先将 `handle_connection` 修改为 `async` 实现:
+```rust
+async fn handle_connection(mut stream: TcpStream) {
+ //<-- snip -->
+}
+```
+
+该修改会将函数的返回值从 `()` 变成 `Future