1, http服务器
<代码>包主要 导入( "net/http” “日志” ) 函数main(){//注册某个函数专门响应某个路由“/?函数签名符合 http。HandleFunc (“/? func (w http。ResponseWriter r * http.Request) { w。写([]字节(“你好,这是版本1 !”)) }) http.HandleFunc(“/再见”,sayBye) 日志。Println(“启动服务器…v1”) log.Fatal (http.ListenAndServe (“4000”, nil)) } func sayBye http (w。ResponseWriter r * http.Request) { w。写([]字节(“再见,这是版本1 !”)) } 去运行test.go 2018/07/09 14:32:08开始服务器……v1 代码>
浏览器打开访问:http://localhost: 4000/
浏览器打开访问:http://localhost: 4000/再见
如何使用mux自定义ServeHTTP,实现http服务器呢?
<代码>包主要 导入( "net/http” “日志” ) 函数main () { mux:=http.NewServeMux () mux.Handle (“/? myHandler {}) mux.HandleFunc(“再见”,sayBye) 日志。Println(“启动服务器…v2”) log.Fatal (http.ListenAndServe (“4000”, mux)) } myHandler struct类型{} func (* myHandler) ServeHTTP http (w。ResponseWriter r * http.Request) { w。写([]字节(“你好,我是版本2 !”)) } func sayBye http (w。ResponseWriter r * http.Request) { w。写([]字节(“再见,这是版本2 !”)) } 去运行test.go 2018/07/09 15:37:35开始服务器……v2 代码>
浏览器打开访问:http://localhost: 4000/
浏览器打开访问:http://localhost: 4000/再见
浏览器打开访问:http://localhost: 4000/六边形abcdef默认也匹配到这里
所有未匹配到的路由都会匹配到跟“/?路由
<代码>包主要 导入( "net/http” “日志” ) 函数main () { mux:=http.NewServeMux () mux.Handle (“/? myHandler{})//所有未匹配到的路由都会匹配到跟路由 mux.HandleFunc(“再见”,sayBye) 日志。Println(“启动服务器…v2”) log.Fatal (http.ListenAndServe (“4000”, mux)) } myHandler struct类型{} func (* myHandler) ServeHTTP http (w。ResponseWriter r * http.Request) { w。写([]字节(“你好v2,请求url是:”+ r.URL.String ())) } func sayBye http (w。ResponseWriter r * http.Request) { w。写([]字节(“再见,这是版本2 !”)) } 去运行test.go 2018/07/09 15:50:23开始服务器……v2 代码>
浏览器打开访问:http://localhost: 4000/你好默认也匹配到/这里
如何自定义服务器信息呢?
<代码> import ( "net/http” “日志” “时间” ) 函数main () { 服务器:=,http.Server { Addr:“4000”, WriteTimeout: 2 * time.Second, } mux:=http.NewServeMux () mux.Handle (“/? myHandler{})//所有未匹配到的路由都会匹配到跟路由 mux.HandleFunc(“再见”,sayBye) server.Handler=mux 日志。Println(“启动服务器…v2”) log.Fatal (server.ListenAndServe) } myHandler struct类型{} func (* myHandler) ServeHTTP http (w。ResponseWriter r * http.Request) { w。写([]字节(“你好v2,请求url是:”+ r.URL.String ())) } func sayBye http (w。ResponseWriter r * http.Request) { w。写([]字节(“再见,这是版本2 !”)) } 去运行test.go 2018/07/09 15:57:46开始服务器……v2 2018/07/09 15:57:46 0 x120ef70 浏览器打开访问:http://localhost: 4000年访问正常代码>
客户端可以主动断开
<代码>包主要 导入( "net/http” “日志” “时间” “操作系统” “os/信号” ) 函数main () { 服务器:=,http.Server { Addr:“4000”, WriteTimeout: 4 * time.Second, } 戒烟:=(chan os.Signal) os.Interrupt signal.Notify(辞职) mux:=http.NewServeMux () mux.Handle (“/? myHandler{})//所有未匹配到的路由都会匹配到跟路由 mux.HandleFunc(“再见”,sayBye) server.Handler=mux 去func () { & lt;戒烟 如果犯错:=server.Close ();犯错!=nil { 日志。致命的(“关闭服务器:犯错) } }() 日志。Println(“启动服务器…v3”) 错:=server.ListenAndServe () 如果犯错!=nil { 如果做错了==http.ErrServerClosed { 日志。打印(“服务器请求下封闭”) 其他}{ 日志。致命的(“服务器关闭意想不到的”) } } 日志。Println(“服务器退出”) } myHandler struct类型{} func (* myHandler) ServeHTTP http (w。ResponseWriter r * http.Request) { w。写([]字节(“你好v2,请求url是:”+ r.URL.String ())) } func sayBye http (w。ResponseWriter r * http.Request) { time . sleep (3 * time.Second) w。写([]字节(“再见,这是版本2 !”)) } 2018/07/09 20:53:41开始服务器……v3 此时暂停程序,ctrl + c 2018/07/09 20:54:01服务器请求下封闭 2018/07/09 20:54:01服务器退出去编程基础4-Http服务器