• Go HTTP服务器


    • HTTP HandleFunc的简单使用
    package main
    
    import (
    	"log"
    	"net/http"
    )
    
    func main() {
    	//注册一个函数,响应某一个路由
    	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    		w.Write([]byte("hello this is version 1!!"))
    	})
    	//这里可以单独写一个函数传递给当前的路由
    	http.HandleFunc("/bye", SayBye)
    	log.Println("Start version v1")
    	log.Fatal(http.ListenAndServe(":4000", nil))
    
    }
    func SayBye(w http.ResponseWriter, r *http.Request) {
    	w.Write([]byte("Bye bye, this is version v1"))
    	//进行一个流式传递,将字符串转换为byte类型
    }
    
    
    • 自己定义mux并使用
    package main
    
    import (
    	"log"
    	"net/http"
    )
    
    func main() {
    	mux := http.NewServeMux()
    	//自己创建servemux,然后使用自己的handle方法
    	mux.Handle("/", &myHandler{})
    	//默认的mux中根路由包含了所有的未匹配的路由
    	mux.HandleFunc("/bye", SayBye)
    
    	log.Println("Start version v1")
    	log.Fatal(http.ListenAndServe(":4000", mux))
    
    }
    
    type myHandler struct{} //自己定义handler结构
    //实现myHandler的ServeHTPP方法
    func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    	w.Write([]byte("Hello this is version 2!,the requeset URL is:" + r.URL.String()))
    	//这里可以打印出完整的URL,响应的都是根路由
    	//大部分web结构的路由都是在ServerHTTP的方法中实现的
    }
    
    func SayBye(w http.ResponseWriter, r *http.Request) {
    	w.Write([]byte("Bye bye, this is version v2"))
    	//进行一个流式传递,将字符串转换为byte类型
    }
    
    
    • ListenAndServe 函数
    源码解析
    func ListenAndServe(addr string, handler Handler) error {
    	server := &Server{Addr: addr, Handler: handler}
    	return server.ListenAndServe()
    }
    //这里可以看出我们可以自定义server对象,然后进行监听
    
    //完整源码
    package main
    
    import (
    	"log"
    	"net/http"
    	"time"
    )
    
    func main() {
    	server := &http.Server{
    		Addr:         ":4000",
    		WriteTimeout: 4 * time.Second,
    	}
    	mux := http.NewServeMux()
    	//自己创建servemux,然后使用自己的handle方法,mux就是实现了handler接口的一个变量
    	mux.Handle("/", &myHandler{})
    	//默认的mux中根路由包含了所有的未匹配的路由
    	mux.HandleFunc("/bye", SayBye)
    	//将mux集成到server当中,server.Handle也是handle类型的接口,所以可以直接赋值
    	server.Handler = mux
    
    	log.Println("Start version v3")
    	log.Fatal(server.ListenAndServe())
    
    }
    
    type myHandler struct{} //自己定义handler结构
    //实现myHandler的ServeHTPP方法
    func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    	w.Write([]byte("Hello this is version 3!,the requeset URL is:" + r.URL.String()))
    	//这里可以打印出完整的URL,响应的都是根路由
    }
    
    func SayBye(w http.ResponseWriter, r *http.Request) {
    	time.Sleep(3 * time.Second)
    	w.Write([]byte("Bye bye, this is version v3"))
    	//进行一个流式传递,将字符串转换为byte类型
    }
    
    
    
    
    • GO1.8的新功能,允许主动停止http服务器
    package main
    
    import (
    	"log"
    	"net/http"
    	"os"
    	"os/signal"
    	"time"
    )
    
    func main() {
    	server := &http.Server{
    		Addr:         ":4000",
    		WriteTimeout: 4 * time.Second,
    	}
    	quit := make(chan os.Signal)
    	//创建chan,用来指示我要退出这个服务器了,麻烦帮忙关闭一下
    	signal.Notify(quit, os.Interrupt)
    	//注册这个通知事件,一旦受到这个singal,发送一个对象到这个chan当中,当我接收到任意对象之后,我就知道服务器该退出了
    	mux := http.NewServeMux()
    	//自己创建servemux,然后使用自己的handle方法,mux就是实现了handler接口的一个变量
    	mux.Handle("/", &myHandler{})
    	//默认的mux中根路由包含了所有的未匹配的路由
    	mux.HandleFunc("/bye", SayBye)
    	//将mux集成到server当中,server.Handle也是handle类型的接口,所以可以直接赋值
    	server.Handler = mux
    	//创建一个gorouting 专门接收这个chan
    	go func() {
    		<-quit
    		if err := server.Close(); err != nil {
    			log.Fatal("Close server:", err)
    		}
    	}()
    
    	log.Println("Start version v3")
    	err := server.ListenAndServe()
    	if err != nil {
    		if err == http.ErrServerClosed {
    			log.Print("Server closed under requeset!!")
    		} else {
    			log.Fatal("Server closed unexpecteed!!")
    		}
    
    	}
    	log.Println("Server exit!!")
    
    }
    
    type myHandler struct{} //自己定义handler结构
    //实现myHandler的ServeHTPP方法
    func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    	w.Write([]byte("Hello this is version 3!,the requeset URL is:" + r.URL.String()))
    	//这里可以打印出完整的URL,响应的都是根路由
    }
    
    func SayBye(w http.ResponseWriter, r *http.Request) {
    	time.Sleep(3 * time.Second)
    	w.Write([]byte("Bye bye, this is version v3"))
    	//进行一个流式传递,将字符串转换为byte类型
    }
    
    
    • 基础模板的用法
  • 相关阅读:
    iOS 在系统设置中展示Version, Build, Git等信息
    iOS10 App跳转到系统设置
    iOS UIPrintInteractionController打印
    iOS U6b3e转字符串
    Xcode8 报 ”xx“is missing from working copy 的问题解决方法
    OC学习篇之---概述 分类: IOS 2014-11-28 19:06 2349人阅读 评论(1) 收藏
    Android中插件开发篇之----类加载器 分类: Android 2014-11-24 12:15 3275人阅读 评论(4) 收藏
    Mac上安装MySql 分类: JavaWeb 2014-11-10 22:11 446人阅读 评论(0) 收藏
    Andrdoid中对应用程序的行为拦截实现方式之----从Java层进行拦截 分类: Android 2014-11-10 11:23 4311人阅读 评论(12) 收藏
    程序猿的克星 2014-11-07 18:11 4519人阅读 评论(2) 收藏
  • 原文地址:https://www.cnblogs.com/skymyyang/p/7929602.html
Copyright © 2020-2023  润新知