简单的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)}}
阅读全文
1 0
- 简单的Socket实现HTTP
- python socket 实现的简单http服务器
- python socket 实现的简单http服务器
- socket实现最最最简单的http请求的数据
- 用java socket实现了一个简单的http服务器
- Socket的简单实现
- 从零开始学写HTTP服务器(二)socket编程实现简单的http server
- 利用Socket搭建简单的Http服务器
- Java Socket现实简单的HTTP服务
- Java Socket现实简单的HTTP服务
- Java Socket现实简单的HTTP服务
- Java Socket现实简单的HTTP服务
- JAVA编写的一个简单的Socket实现的HTTP响应服务器
- JAVA编写的一个简单的Socket实现的HTTP响应服务器
- JAVA编写的一个简单的Socket实现的HTTP响应服务器
- JAVA编写的一个简单的Socket实现的HTTP响应服务器进阶版
- socket通信的简单实现
- socket实现简单的上传下载
- css-文字设置
- B树、B+树、B*树
- 上传的文件(图片)在Eclipse中能看到,在浏览器中看不到的解决办法
- Eclipse关联Jar包,仍然无法查看源码
- 查找最小的K个数
- 简单的Socket实现HTTP
- Atcoder Grand Contest 019 总结
- win10配置MongoDB
- Pull解析 详细流程
- 51nod1081 子段求和(前缀和)
- 生成歌词多层的lstam
- UVA
- 开发利器
- 关于前端开发中的构造函数模式和原型模式