<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Go Socket實現簡單的HttpServer

      在上篇博客中寫到如何用Python實現一個類似tomcat的簡單服務器,接下來用go語言去實現

      1. Go本身自己封裝實現了非常簡單的httpServer

      package main
      
      import (
          "bufio"
          "fmt"
          "io"
          "net/http"
          "os"
          "strings"
      )
      
      func main() {
          //http請求處理
          http.HandleFunc("/", handler1)
          //綁定監聽地址和端口
          http.ListenAndServe("localhost:8080", nil)
      }
      
      //請求處理函數
      func handler1(w http.ResponseWriter, r *http.Request) {
          //獲取請求資源
          path := r.URL.Path
          if strings.Contains(path[1:], "") {
              //返回請求資源
              fmt.Fprintf(w, getHtmlFile("index.html"))
          } else {
              if strings.Contains(path[1:], ".html") {
                  w.Header().Set("content-type", "text/html")
                  fmt.Fprintf(w, getHtmlFile(path[1:]))
              }
              if strings.Contains(path[1:], ".css") {
                  w.Header().Set("content-type", "text/css")
                  fmt.Fprintf(w, getHtmlFile(path[1:]))
              }
              if strings.Contains(path[1:], ".js") {
                  w.Header().Set("content-type", "text/javascript")
                  fmt.Fprintf(w, getHtmlFile(path[1:]))
              }
              if strings.Contains(path[1:], "") {
                  fmt.Print(strings.Contains(path[1:], ""))
              }
          }
      
      }
      
      func getHtmlFile(path string) (fileHtml string) {
          file, err := os.Open(path)
          if err != nil {
              panic(err)
          }
          defer file.Close()
      
          rd := bufio.NewReader(file)
          for {
              line, err := rd.ReadString('\n')
      
              if err != nil || io.EOF == err {
                  break
              }
              fileHtml += line
          }
          return fileHtml
      }
      
      

      從上面的代碼可以看出,關鍵的依賴是net/http,這個類庫實現得非常好,而且支持并發,在這個就不去分析源碼。

      2. 但對于自己實現簡易的服務器,最好還是用socket去實現:

      實現之前還是需具備了解http等一些基礎知識,因為上篇博客已經介紹了,所以在這里不介紹了 直接寫代碼

      package main
      
      import (
          "bufio"
          "fmt"
          "io"
          "log"
          "net"
          "os"
          "strings"
      )
      
      func main() {
          //確定協議及綁定IP及端口
          netListen, err := net.Listen("tcp", "localhost:8080")
          CheckError(err)
          defer netListen.Close()
          Log("waiting for client request")
          for {
              //接受請求連接
              conn, err := netListen.Accept()
              if err != nil {
                  CheckError(err)
                  break
              } else {
                  Log(conn.RemoteAddr().String(), "tcp connect success")
                  //處理請求連接
                  handleConnection(conn)
              }
              conn.Close()
          }
      }
      
      //處理請求連接函數
      func handleConnection(conn net.Conn) {
          buffer := make([]byte, 2048)
          n, err := conn.Read(buffer)
          if err != nil {
              Log(conn.RemoteAddr().String(), " connection error: ", err)
              conn.Close()
          } else {
              Log(conn.RemoteAddr().String(), "receive data string:\n", string(buffer[:n]))
              //返回數據給客戶端
              responseInfoToClient(conn, string(buffer[:n]), err)
          }
      }
      
      //返回數據的函數
      func responseInfoToClient(conn net.Conn, requestInfo string, err error) {
          //獲取http協議頭
          conn.Write([]byte(getFileContent("head.md")))
          conn.Write([]byte("\n"))
          var path string = strings.Replace(getMidStr(requestInfo, "GET /", "HTTP"), " ", "", -1)
          fmt.Println(path)
          if path != "" {
              if path == "favicon.ico" {
                  fmt.Println("every connect hava favicon.ico resource request")
              } else {
                  _, err = os.Open(path)
                  if err != nil {
                      fmt.Println("RESTful")
                  } else {
                      conn.Write([]byte(getFileContent(path)))
                  }
              }
          } else {
              conn.Write([]byte(getFileContent("index.html")))
          }
      }
      
      func getMidStr(data string, startStr string, endStr string) (reqSouce string) {
          var startIndex int = strings.Index(data, startStr)
          var info string
          if startIndex >= 0 {
              startIndex += len(startStr)
              var endIndex int = strings.Index(data, endStr)
              info = data[startIndex:endIndex]
          }
          return info
      }
      
      func getFileContent(path string) (fileInfo string) {
          file, err := os.Open(path)
          if err != nil {
              panic(err)
          }
          defer file.Close()
      
          rd := bufio.NewReader(file)
          for {
              line, err := rd.ReadString('\n')
      
              if err != nil || io.EOF == err {
                  break
              }
              fileInfo += line
          }
          return fileInfo
      }
      
      func Log(v ...interface{}) {
          log.Println(v...)
      }
      
      func CheckError(err error) {
          if err != nil {
              fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
              os.Exit(1)
          }
      }
      
      

      源碼下載:https://github.com/Jiashengp/GoHttpServer

      posted @ 2017-02-06 17:13  技術即藝術  閱讀(4575)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 漂亮人妻中文字幕丝袜| 国产三级国产精品久久成人| 男人又大又硬又粗视频| 亚洲男人天堂2021| 一本av高清一区二区三区| 黑人异族巨大巨大巨粗| 日韩免费视频一一二区| 贵州省| 国产在线视频精品视频| 国产精品色呦呦在线观看| 丁香五月亚洲综合深深爱| 亚洲一本大道在线| 蜜臀精品一区二区三区四区| 国产一码二码三码区别| 亚洲色大成网站WWW永久麻豆| 精品国产一区二区三区卡| 亚洲中文在线精品国产| 天天澡日日澡狠狠欧美老妇 | 麻豆一区二区三区香蕉视频| 噜噜噜噜私人影院| 精品人妻无码一区二区三区| 亚洲无人区码一二三四区| 深田えいみ禁欲后被隔壁人妻| 精品少妇人妻av无码久久| 国内视频偷拍久久伊人网| 亚洲va久久久噜噜噜久久狠狠| 2021精品亚洲中文字幕| 亚洲人成人影院在线观看| 久久99国产精品尤物| 国产无套精品一区二区三区| 日本国产精品第一页久久| 亚洲码亚洲码天堂码三区| 亚洲国产亚洲综合在线尤物| 制服 丝袜 亚洲 中文 综合| 亚洲熟女乱色综合亚洲图片| 性欧美vr高清极品| 国产办公室秘书无码精品99| 四虎国产成人永久精品免费| 国产中文三级全黄| 丰城市| 国产精品自在拍在线播放|