本节主要编写golang代码,调用http相关接口,实现web连接和信息的处理。
学习的过程由简入繁,通过3段代码了解并熟悉http的相关接口,实现一些客户端和服务端的简单交互。
1、浏览器打开本地ip,在浏览器输出服务器传送过来的信息文字。
package main
import (
"net/http"
"log"
)
func main(){
//绑定监听方法
http.HandleFunc("/", sayHello)
log.Println("Start server version 1")
//指定端口号(不要与其他程序发生冲突)
log.Fatal(http.ListenAndServe(":5000", nil))
}
//注意:ResponseWriter是引用类型,而Request是结构体,传入的的内存地址
func sayHello(w http.ResponseWriter, req *http.Request){
//在响应返回中设置返回信息
w.Write([]byte("Hello, this is version 1!"))
}
在网址上输入:![]()
输出结果为:![]()
2、为了让程序更灵活,我们对上例的代码进行一些修改,不直接使用http.HandleFunc接口,而是做相关的扩展。
首先我们看下http.HandleFunc的源码:

我们可以看到,HandleFunc函数其实是调用了DefaultServeMux的HandleFunc方法,接下来我们看看DefaultServeMux的相关定义:

DefaultServeMux其实就是http内部定义的ServeMux类型数据的内存地址,在上面的源码中可以看到,调用http.NewServeMux()方法就能创建ServeMux数据。
修改后的代码如下:
package main
import (
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", sayHello)
log.Println("Start server version 2")
log.Fatal(http.ListenAndServe(":5000", mux))
}
func sayHello(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("Hello, this is version 2"))
}
输出结果为:![]()
3、在上例代码的基础上继续改进。
绑定监听方法除了用ServeMux的HandleFunc外,还可以使用ServeMux的Handle()方法,
Handle方法更加灵活、扩展性更强。Handle()方法的参数第一个不变,第二个是参数http.Handler接口,我们需要定义一个继承了http.Handler接口的struct类型,并为这个类型实现ServeTTP方法。另外不再使用http.ListenAndServe方法,改为创建http.Server数据并调用其ListenAndServe方法,完整代码如下:
package main
import (
"log"
"net/http"
"time"
)
func main() {
mux := http.NewServeMux()
//调用自定义的handler
mux.Handle("/", &MyHandler{})
//创建server,可以设置其中的参数值,更加灵活
server := &http.Server{
Addr: ":5000",
WriteTimeout: 2 * time.Second,
Handler: mux,
}
log.Println("Start server version 3")
//不使用http.ListenAndServe方法,改为调用server.ListenAndServe
log.Fatal(server.ListenAndServe())
}
type MyHandler struct{}
func (h *MyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("Hello, this is version 3"))
}
运行结果为:![]()
4、配合channel控制server的关闭
完整代码如下:
package main
import (
"log"
"net/http"
"os"
"os/signal"
"time"
)
func main() {
mux := http.NewServeMux()
mux.Handle("/", &myHandler{})
server := http.Server{
Addr: ":5000",
WriteTimeout: 5 * time.Second,
Handler: mux,
}
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
go func() {
<-quit
if err := server.Close(); err != nil {
log.Fatal("Close server!", err)
}
}()
log.Println("Start server version 3")
err := server.ListenAndServe()
if err != nil {
if err == http.ErrServerClosed {
log.Println("Server close under request!")
} else {
log.Println("Server close under unexpected!")
}
}
log.Println("Server exit")
}
type myHandler struct{}
func (h *myHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("Hello, this is version 3"))
}
本文介绍如何使用Golang编写Web服务器,包括三种不同方式实现HTTP请求处理和服务启动过程。从简单的文本响应到更复杂的服务器配置均有涉及。
195

被折叠的 条评论
为什么被折叠?



