去编程基础4-Http服务器

  

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服务器”
浏览器打开访问:http://localhost: 4000/再见
叭ケ喑袒?-Http服务器"

  

如何使用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服务器”
浏览器打开访问:http://localhost: 4000/再见

  

浏览器打开访问:http://localhost: 4000/六边形abcdef默认也匹配到这里
叭ケ喑袒?-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。写([]字节(“你好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/你好默认也匹配到/这里
叭ケ喑袒?-Http服务器"

  

如何自定义服务器信息呢?

  
 <代码> 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服务器