这个例子只是一个非常简单的学习示例,用来说明用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?
追求极致性能?