这个小程序是从,HTTP: The Definitive Guide, A Minimal Perl Web Server 移植而来。
package main
import (
"fmt"
"net"
"bufio"
)
func main() {
ln, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println(err)
return
}
for {
conn, err := ln.Accept()
if err != nil {
fmt.Println("Accept err= ", err)
}
fmt.Printf(" <<<Request From '%s'>>>\n", conn.RemoteAddr())
rd := bufio.NewReader(conn)
for {
line, _, err := rd.ReadLine()
if err != nil {
fmt.Println("ReadLine err= ", err)
}
if string(line) == "" {
fmt.Println("")
fmt.Fprintf(conn, "HELLOWORLD")
conn.Close()
break
}
fmt.Println(string(line))
}
}
}
一个HTTP Request
由Startline
, Headers
和Body
组成。
Startline和Header都是由ASCII字符组成,以行来分隔。每一行都以回车(ASCII 13)和换行(ASCII 10)组成。通常称作CRLF。
Body不Startline和Header不同,可以包括字符或者二进制数据,或者为空。
HTTP服务器,就是一个监听指定端口上的TCP连接的程序,检测到连接后,打印出连接端的IP, 然后回显HelloWorld,然后关闭连接。
编译运行该程序后,使用chrome访问,http://192.168.1.3:8080 (192.168.1.3是本机IP) 该服务器有如下打印,可以看到Chrome建立了两个TCP请求,其中一个用来请求favicon.ico
<<<Request From '192.168.1.3:57770'>>>
GET / HTTP/1.1
Host: 192.168.1.3:8080
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
<<<Request From '192.168.1.3:57771'>>>
GET /favicon.ico HTTP/1.1
Host: 192.168.1.3:8080
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3