16.蛤蟆笔记go语言——Web服务器
http包建立WEB服务器
代码如下:
package main
import (
"fmt"
"log"
"net/http"
"strings"
)
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)
}
}
执行后,已经在9090端口监听http链接请求了。
浏览器输入:http://localhost:9090
服务端输出:
Map[]
path /
scheme
[]
客户端输出:
Hello astaxie!
浏览器输入:http://localhost:9090/?url_long=111&url_long=222
服务端输出:
map[url_long:[111 222]]
path /
scheme
[111 222]
key: url_long
val: 111222
要编写一个web服务器很简单,只要调用http包的两个函数就可以了。
go拥有类似python这样动态语言的特性,写web应用很方便。
如果你以前是ruby程序员,会发现和ROR的/script/server启动有点类似。
Go通过简单的几行代码就已经运行起来一个web服务了,而且这个Web服务内部有支持高并发的特性
Web工作方式
Request:用户请求的信息,用来解析用户的请求信息,包括post、 get、 cookie、 url等信息
Response:服务器需要反馈给客户端的信息
Conn:用户的每次请求链接
Handler:处理请求和生成返回信息的处理逻辑
分析 http包运行机制
如下图1:
Go是如何让Web运行起来
•如何监听端口?
•如何接收客户端请求?
•如何分配handler?
我们可以看到,Go是通过一个函数ListenAndServe来处理这些事情的,这个底层其实这样处理的:初始化一个server对象,然后调用了net.Listen("tcp", addr),也就是底层用TCP协议搭建了一个服务,然后监控我们设置的端口。
HTTP源码包执行流程如下图2:
有疑问加站长微信联系(非本文作者)