这个例子只是一个非常简单的学习示例,用来说明用socket编程来实现一个http服务的例子,大家可以举一反三。
package main
import (
"bufio"
"fmt"
"io/ioutil"
"net"
"os"
"strconv"
)
func FileGetContents(fileName string) (string, error) {
file, err := os.Open(fileName)
if err != nil {
return "", err
}
defer file.Close()
content, err := ioutil.ReadAll(file)
return string(content), nil
}
func responseHtml(fileName string) string {
body, _ := FileGetContents(fileName)
bodyLen := len(body)
result := ""
result += "HTTP/1.1 200\r\n"
result += "Content-Length:" + strconv.Itoa(bodyLen) + "\r\n"
result += "Content-Type: text/html;charset=utf-8\r\n"
result += "\r\n" + body + "\r\n"
return result
}
func readLine(bufr *bufio.Reader) ([]byte, error) {
p, isPrefix, err := bufr.ReadLine()
if err != nil {
return p, err
}
var l []byte
for isPrefix {
l, isPrefix, err = bufr.ReadLine()
if err != nil {
break
}
p = append(p, l...)
}
return p, err
}
func DealConn(conn net.Conn) {
// 处理完关闭连接
defer conn.Close()
fmt.Println("new conn\n")
// 针对当前连接做发送和接受操作
for {
reader := bufio.NewReader(conn)
line, err := readLine(reader)
// 数据读取正确
if err == nil {
requestMethod := ""
requestUrl := ""
requestProto := ""
fmt.Sscanf(string(line), "%s%s%s", &requestMethod, &requestUrl, &requestProto)
fmt.Println("request:", requestMethod, requestUrl, requestProto)
// 回复消息
conn.Write([]byte(responseHtml("." + requestUrl)))
} else {
break
}
}
}
func main() {
// 建立tcp 服务
listen, err := net.Listen("tcp", "0.0.0.0:1215")
if err != nil {
fmt.Printf("listen failed, err:%v\n", err)
return
}
for {
// 等待客户端建立连接
fmt.Printf("accept conn ...... \n")
conn, err := listen.Accept()
if err != nil {
fmt.Printf("accept failed, err:%v\n", err)
continue
}
// 启动一个单独的 goroutine 去处理连接
go DealConn(conn)
}
}

大家可以说下什么业务场景下需要自己编写http Server?
追求极致性能?