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 diff --git a/3.1.md b/3.1.md index 5f3394fc..45ea6bcd 100644 --- a/3.1.md +++ b/3.1.md @@ -7,20 +7,20 @@ ![](images/3.1.web2.png?raw=true) 一个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。这个客户端通常指的是Web浏览器(手机端客户端其实内部也是浏览器实现)。 - + Web服务器的工作原理简单的可以归纳为: - 客户机通过socket建立到服务器的连接 -- 客户端向服务器发送请求,http协议包,请求转化成服务器对应的文档 +- 客户端向服务器发送请求,http协议包,请求转化成服务器对应的文档 - 服务器向客户机发送应答,http协议包,请求的如果包含有动态语言的部分,那么动态语言把相应的数据结果返回给客户端 -- 客户机与服务器断开。客户端解释HTML文档,在客户端屏幕上显示结果。 +- 客户机与服务器断开。客户端解释HTML文档,在客户端屏幕上显示结果 一个简单的事务处理事件就是这样实现的,看起来很复杂,做起来其实是挺简单的,需要注意的是客户机与服务器之间的通信是非连接的,也就是当服务器发送了应答后就与客户机断开连接,等待下一次请求。 ##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) @@ -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协议版本号, 状态码, 状态消息 三部分组成。 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$