From 3fa30ad8b8d886dddeb4c63e61008f3db931c215 Mon Sep 17 00:00:00 2001 From: JessonChan Date: Sun, 14 Oct 2012 15:20:26 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E9=80=9A=E9=A1=BA=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 见diff --- 2.7.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2.7.md b/2.7.md index f32c4061..48d0e8da 100644 --- a/2.7.md +++ b/2.7.md @@ -1,6 +1,6 @@ #2.7 并发 -有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而GO语言层面就支持了并行。 +有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而GO从语言层面就支持了并行。 ##Goroutines From 47e373063a54da749dfa2ac4af496b8d4d682fe6 Mon Sep 17 00:00:00 2001 From: JessonChan Date: Sun, 14 Oct 2012 15:25:36 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E6=95=88?= =?UTF-8?q?=E7=A9=BA=E7=99=BD=E5=AD=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RT --- 3.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3.1.md b/3.1.md index 5f3394fc..89b7d6dd 100644 --- a/3.1.md +++ b/3.1.md @@ -7,7 +7,7 @@ ![](images/3.1.web2.png?raw=true) 一个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。这个客户端通常指的是Web浏览器(手机端客户端其实内部也是浏览器实现)。 - + Web服务器的工作原理简单的可以归纳为: - 客户机通过socket建立到服务器的连接 From fe2019b6db049be742c9b4bd00e3e1a1be5c17b2 Mon Sep 17 00:00:00 2001 From: JessonChan Date: Sun, 14 Oct 2012 15:27:38 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E7=AC=A6=E5=8F=B7=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 标点中英文错误 --- 3.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3.1.md b/3.1.md index 89b7d6dd..8644767e 100644 --- a/3.1.md +++ b/3.1.md @@ -11,7 +11,7 @@ Web服务器的工作原理简单的可以归纳为: - 客户机通过socket建立到服务器的连接 -- 客户端向服务器发送请求,http协议包,请求转化成服务器对应的文档 +- 客户端向服务器发送请求,http协议包,请求转化成服务器对应的文档 - 服务器向客户机发送应答,http协议包,请求的如果包含有动态语言的部分,那么动态语言把相应的数据结果返回给客户端 - 客户机与服务器断开。客户端解释HTML文档,在客户端屏幕上显示结果。 From 24a909b30d80c418737d81cfaa6dfdd4e395b93e Mon Sep 17 00:00:00 2001 From: JessonChan Date: Sun, 14 Oct 2012 15:29:35 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E6=A0=87=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3.1.md b/3.1.md index 8644767e..d85a9fac 100644 --- a/3.1.md +++ b/3.1.md @@ -13,7 +13,7 @@ Web服务器的工作原理简单的可以归纳为: - 客户机通过socket建立到服务器的连接 - 客户端向服务器发送请求,http协议包,请求转化成服务器对应的文档 - 服务器向客户机发送应答,http协议包,请求的如果包含有动态语言的部分,那么动态语言把相应的数据结果返回给客户端 -- 客户机与服务器断开。客户端解释HTML文档,在客户端屏幕上显示结果。 +- 客户机与服务器断开。客户端解释HTML文档,在客户端屏幕上显示结果 一个简单的事务处理事件就是这样实现的,看起来很复杂,做起来其实是挺简单的,需要注意的是客户机与服务器之间的通信是非连接的,也就是当服务器发送了应答后就与客户机断开连接,等待下一次请求。 From 60667c3f72bc5aa29b7015c5de5cb0e11b82e772 Mon Sep 17 00:00:00 2001 From: JessonChan Date: Sun, 14 Oct 2012 15:34:31 +0800 Subject: [PATCH 5/8] =?UTF-8?q?url=E6=94=B9=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3.1.md b/3.1.md index d85a9fac..aa21e413 100644 --- a/3.1.md +++ b/3.1.md @@ -20,7 +20,7 @@ Web服务器的工作原理简单的可以归纳为: ##URL和DNS解析 我们浏览网页都是通过URL访问的,那么URL到底是怎么样的呢? -URL(Uniform Resource Locator)地址用于描述一个网络上的资源, 基本格式如下 +URL是英文Uniform Resource Locator的缩写,中文称为统一资源定位符,是用于描述一个网络上的资源, 基本格式如下 schema://host[:port#]/path/.../[?query-string][#anchor] scheme 指定低层使用的协议(例如:http, https, ftp) From aa3e808bd9d9c6f038639a348ee2427ff4442414 Mon Sep 17 00:00:00 2001 From: JessonChan Date: Sun, 14 Oct 2012 15:38:09 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E7=BC=A9=E5=86=99=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 统一url和dns的说明风格,更简单 --- 3.1.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/3.1.md b/3.1.md index aa21e413..98ce32b6 100644 --- a/3.1.md +++ b/3.1.md @@ -20,7 +20,7 @@ Web服务器的工作原理简单的可以归纳为: ##URL和DNS解析 我们浏览网页都是通过URL访问的,那么URL到底是怎么样的呢? -URL是英文Uniform Resource Locator的缩写,中文称为统一资源定位符,是用于描述一个网络上的资源, 基本格式如下 +URL(Uniform Resource Locator)是“统一资源定位符”的英文缩写,用于描述一个网络上的资源, 基本格式如下 schema://host[:port#]/path/.../[?query-string][#anchor] scheme 指定低层使用的协议(例如:http, https, ftp) @@ -30,7 +30,7 @@ URL是英文Uniform Resource Locator的缩写,中文称为统一资源定位 query-string 发送给http服务器的数据 anchor 锚 - DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它从事将主机名或域名转换为实际IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。 + DNS(Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它从事将主机名或域名转换为实际IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。 ![](images/3.1.dns.png?raw=true) From 908407153bc109c6cdf7633dfe260c8c1309a5ee Mon Sep 17 00:00:00 2001 From: JessonChan Date: Sun, 14 Oct 2012 16:01:18 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8D=E8=A7=84?= =?UTF-8?q?=E5=88=99=E7=9A=84=E9=97=B4=E9=9A=94=E5=AD=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 把不等的space改为tab --- 3.1.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/3.1.md b/3.1.md index 98ce32b6..45ea6bcd 100644 --- a/3.1.md +++ b/3.1.md @@ -70,11 +70,11 @@ HTTP协议是无状态的,同一个客户端的这次请求和上次请求是 - 请求行:GET/POST(流的组织(请求)方式) URL(地址+目录) 版本号 - 请求头: - Host:客户端IP和端口 - User-Agent:浏览器信息 - Accept:客户端能接收的数据类型 - Accept-encoding:是否支持压缩的流 - Accept-charset:客户端字符编码集 + Host:客户端IP和端口 + User-Agent:浏览器信息 + Accept:客户端能接收的数据类型 + Accept-encoding:是否支持压缩的流 + Accept-charset:客户端字符编码集 - 空行:分割请求头和消息体 - 消息体:请求的参数 @@ -98,9 +98,9 @@ Http协议定义了很多与服务器交互的方法,最基本的有4种,分 - 状态行:HTTP版本 服务器状态(比如:404找不到...) 描述信息 - 响应头 - Content-Type:服务器发送信息的类型 - Date:发送时间 - Server:服务器类型 + Content-Type:服务器发送信息的类型 + Date:发送时间 + Server:服务器类型 - 消息体:服务器发送给客户端的页面内容 Response 消息中的第一行叫做状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。 From d999fcc7929a8d906c343e31c981e930c04ffc60 Mon Sep 17 00:00:00 2001 From: JessonChan Date: Sun, 14 Oct 2012 16:11:29 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E5=88=A0=E9=99=A4^M?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit windows保存的换行^M --- 3.2.md | 122 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/3.2.md b/3.2.md index 2f830acd..ec7c1dc7 100644 --- a/3.2.md +++ b/3.2.md @@ -1,53 +1,53 @@ -#3.2 GO搭建一个web服务器 - -前面小节已经介绍了Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的就搭建起来一个可以运行的web服务。同时使用这个包能很简单地对web的路由,静态文件,模版,cookie等数据进行设置和操作。 - -##http包建立web服务器 - - package main - - import ( - "fmt" - "net/http" - "strings" - "log" - ) - - func sayhelloName(w http.ResponseWriter, r *http.Request) { - r.ParseForm() //解析参数,默认是不会解析的 - fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息 - fmt.Println("path", r.URL.Path) - fmt.Println("scheme", r.URL.Scheme) - fmt.Println(r.Form["url_long"]) - for k, v := range r.Form { - fmt.Println("key:", k) - fmt.Println("val:", strings.Join(v, "")) - } - fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的 - } - - func main() { - http.HandleFunc("/", sayhelloName) //设置访问的路由 - err := http.ListenAndServe(":9090", nil) //设置监听的端口 - if err != nil { - log.Fatal("ListenAndServe: ", err) - } - } - -上面这个代码,我们build之后,然后执行web.exe,这个时候其实已经在9090端口监听tcp链接请求了。 - -在浏览器输入`http://localhost:9090` - -可以看到浏览器页面输出了`Hello astaxie!` - -可以换一个地址试试:`http://localhost:9090/?url_long=111&url_long=222` - -看看浏览器输出的是什么,服务器输出的是什么? - -在服务器端输出的信息如下: - -![](images/3.2.goweb.png?raw=true) - +#3.2 GO搭建一个web服务器 + +前面小节已经介绍了Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的就搭建起来一个可以运行的web服务。同时使用这个包能很简单地对web的路由,静态文件,模版,cookie等数据进行设置和操作。 + +##http包建立web服务器 + + package main + + import ( + "fmt" + "net/http" + "strings" + "log" + ) + + func sayhelloName(w http.ResponseWriter, r *http.Request) { + r.ParseForm() //解析参数,默认是不会解析的 + fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息 + fmt.Println("path", r.URL.Path) + fmt.Println("scheme", r.URL.Scheme) + fmt.Println(r.Form["url_long"]) + for k, v := range r.Form { + fmt.Println("key:", k) + fmt.Println("val:", strings.Join(v, "")) + } + fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的 + } + + func main() { + http.HandleFunc("/", sayhelloName) //设置访问的路由 + err := http.ListenAndServe(":9090", nil) //设置监听的端口 + if err != nil { + log.Fatal("ListenAndServe: ", err) + } + } + +上面这个代码,我们build之后,然后执行web.exe,这个时候其实已经在9090端口监听tcp链接请求了。 + +在浏览器输入`http://localhost:9090` + +可以看到浏览器页面输出了`Hello astaxie!` + +可以换一个地址试试:`http://localhost:9090/?url_long=111&url_long=222` + +看看浏览器输出的是什么,服务器输出的是什么? + +在服务器端输出的信息如下: + +![](images/3.2.goweb.png?raw=true) + 我们看到上面的代码,要编写一个web服务器很简单,只要调用http包的两个函数就可以了。 >- 如果你以前是PHP程序员,那你也许就会问,我们的nginx、apache服务器不需要吗?Go就是不需要这些,因为他直接就监听tcp端口了,做了nginx做的事情,然后sayhelloName这个其实就是我们写的逻辑函数了,也就是php里面的执行逻辑类似。 @@ -58,14 +58,14 @@ 我们看到Go通过简单的几行代码就已经运行起来一个web服务了,而且这个Web服务内部已经支持了高并发的特性,我将会在接下来的两个小节里面详细的讲解一下go是如何实现Web高并发的。 - - - - -## links - * [目录]() - * 上一节: [Web工作方式](<3.1.md>) - * 下一节: [Go如何使得web工作](<3.3.md>) - -## LastModified - * $Id$ \ No newline at end of file + + + + +## links + * [目录]() + * 上一节: [Web工作方式](<3.1.md>) + * 下一节: [Go如何使得web工作](<3.3.md>) + +## LastModified + * $Id$