该方法用于在指定的 TCP 网络地址 addr 进行监听,然后调用服务端处理程序来处理传入的连接请求。
ListenAndServe 方法有两个参数,其中第一个参数 addr 即监听地址,第二个参数表示服务端处理程序,通常为空。第二个参数为空时,意味着服务端调用 http.DefaultServeMux 进行处理,而服务端编写的业务逻辑处理程序 http.Handle() 或 http.HandleFunc() 默认注入 http.DefaultServeMux 中,代码如下所示:
http.Handle("/foo", fooHandler)
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
log.Fatal(http.ListenAndServe(":8080", nil))
如果想更多地控制服务端的行为,可以自定义 http.Server,代码如下所示:
s := &http.Server{
Addr: ":8080",
Handler: myHandler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())
下面通过一个简单的服务端示例来演示一下Go语言是如何处理 HTTP 请求的,代码如下所示:
package main
import (
"io"
"log"
"net/http"
)
func HelloServer(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "城东书院\n")
}
func main() {
http.HandleFunc("/hello", HelloServer)
err := http.ListenAndServe(":12345", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
成功运行上面的代码会占用 12345 端口,我们可以使用浏览器访问http://localhost:12345/hello来查看运行结果,如下所示:
ListenAndServeTLS 函数和 ListenAndServe 函数的行为基本一致,区别在于 ListenAndServeTLS 函数只处理 HTTPS 请求。
此外,服务器上必须提供证书文件和对应的私钥文件,比如 certFile 对应 SSL 证书文件存放路径,keyFile 对应证书私钥文件路径。如果证书是由权威机构签发的,certFile 参数指定的路径必须是存放在服务器上的经由 CA 认证过的 SSL 证书。
开启 SSL 监听服务也很简单,如下列代码所示:
http.Handle("/foo", fooHandler)
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
log.Fatal(http.ListenAndServeTLS(":10443", "cert.pem", "key.pem", nil))
或者是:
ss := &http.Server{
Addr: ":10443",
Handler: myHandler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
log.Fatal(ss.ListenAndServeTLS("cert.pem", "key.pem"))
下面通过示例来演示一下Go语言时如何处理 HTTPS 请求的,代码如下所示:
package main
import (
"log"
"net/http"
)
func handler(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/plain")
w.Write([]byte("城东书院\n"))
}
func main() {
http.HandleFunc("/", handler)
log.Printf("监听 1234 端口成功,可以通过 https://127.0.0.1:1234/ 访问")
err := http.ListenAndServeTLS(":1234", "cert.pem", "key.pem", nil)
if err != nil {
log.Fatal(err)
}
}
运行上面的程序需要用到 cert.pem 和 key.pem 这两个文件,可以使用 crypto/tls 包的 generate_cert.go 文件来生成 cert.pem 和 key.pem 这两个文件,运行结果如下: