简单的Socket实现HTTP

来源:互联网 发布:ifunbox mac 破解版 编辑:程序博客网 时间:2024/06/16 10:16

关于HTTP协议,可以参考:

http协议

首先直接用标准库的net/http包

package mainimport ("log""net/http")func index(w http.ResponseWriter, r *http.Request) {http.ServeFile(w, r, "index.html")}func main() {http.HandleFunc("/", index)log.Println("Now Listening...")log.Fatal(http.ListenAndServe(":8080", nil))}

Socket实现:

package mainimport ("io/ioutil""log""net""strconv""strings""time")//简单的响应结构体type Response struct {net.Connheader map[string]stringcode   intstatus string}//newResponsefunc NewResponse(conn net.Conn) *Response {return &Response{Conn:   conn,header: make(map[string]string),}}//响应消息报头func (this *Response) WriteHeader(key, value string) {this.header[key] = value}//响应状态func (this *Response) Status(code int, status string) {this.code = codethis.status = status}//响应func (this *Response) Write(data []byte) {this.Status(200, "OK")wheader := []byte("HTTP/1.1 " + strconv.Itoa(this.code) + " " + this.status + "\n")this.WriteHeader("Content-Type", "text/html")this.WriteHeader("Date", time.Now().Format(time.RFC1123))this.WriteHeader("Content-Length", strconv.Itoa(len(data)))for k, v := range this.header {wheader = append(wheader, []byte(k+":"+v+"\n")...)}wheader = append(wheader, '\n')log.Println(string(wheader))log.Println(string(data))this.Conn.Write(wheader)this.Conn.Write(data)}//读取文件func getFileContent(path string) []byte {data, err := ioutil.ReadFile(path)CheckErr("read file error:", err)return data}func CheckErr(errInfo string, err error) {if err != nil {log.Fatalln(errInfo, err.Error())}}func Handle(conn net.Conn) {r := ParseRequest(conn)w := NewResponse(conn)var data []byteif r.path[1:] != "" {if r.path[1:] != "favicon.ico" {data = getFileContent(r.path)} else {data = []byte{}}} else {data = getFileContent("./index.html")}w.Write(data)conn.Close()}//简单请求结构体type Request struct {method stringpath   string//header map[string]string}//解释请求func ParseRequest(conn net.Conn) *Request {rbuf := make([]byte, 1024)n, err := conn.Read(rbuf)if err != nil {log.Println("connection read err:", err)conn.Close()}rbuf = rbuf[:n]mindex := strings.Index(string(rbuf), "/")method := strings.Trim(string(rbuf[:mindex]), " ")path := strings.Trim(getMidStr(string(rbuf), method, "HTTP/"), " ")return &Request{method: method,path:   path,}}func getMidStr(str, start, end string) string {stIndex := strings.Index(str, start)if stIndex > -1 {endIndex := strings.Index(str, end)if endIndex > stIndex {return str[stIndex+len(start) : endIndex]}}return ""}func main() {ls, err := net.Listen("tcp", ":8080")CheckErr("listen err:", err)defer ls.Close()log.Println("Now Listening...")for {conn, err := ls.Accept()if err != nil {log.Println("Accept err:", err.Error())conn.Close()continue}go Handle(conn)}}


原创粉丝点击