用go想做一個http代理的小工具:
func main() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
log.Panic(err)
}
for {
client, err := listener.Accept()
if err != nil {
log.Panic(err)
}
go handleClientRequest(client)
}
}
func handleClientRequest(client net.Conn) {
if client == nil {
return
}
defer client.Close()
var buf [1024]byte
n, err := client.Read(buf[:])
if err != nil {
log.Println(err)
return
}
fmt.Println("recv msg:", string(buf[0:n]))
}
1024個位元組不一定夠,一定要有個結束標誌吧?
TCP協定透過發送FIN包來釋放連接,所以FIN包就是結束標誌,也就是說一直接收到連接斷開就接收完了。
但是
那麼開啟了Keep-Alive之後該如何判斷結束呢?
其實,HTTP頭有個content-length,這就是HTTP包內文長度了
當然也有沒有content-length的情況,那就是使用了分塊編碼(chunked encoding)資料是分成一系列的區塊來傳送的,每區塊都有大小說明。即使伺服器在生成首部的時候不知道整個實體的大小(通常是因為實體是動態生成的),仍然可以使用分塊編碼傳輸若干已知大小的塊。
另外HTTP訊息標頭與訊息正文之間透過CRLF(回車換行),
rnrn
來分隔