在Golang中寫一個http web伺服器大緻是有兩種方法:
1 使用net包的net.Listen來對端口進行監聽
2 使用net/http包
這裡是讨論如何使用net/http包建立一個web伺服器
net/http請求提供了HTTP用戶端和服務端的具體實作
先看到的是Get,Post,PostForm三個函數。這三個函數直接實作了http用戶端
1
2
3
4
5
6
7
8
9
10
11
12
<code>import (</code>
<code> </code><code>"fmt"</code>
<code> </code><code>"net/http"</code>
<code> </code><code>"io/ioutil"</code>
<code>)</code>
<code>func main() {</code>
<code> </code><code>response,_ := http.Get(</code><code>"http://www.baidu.com"</code><code>)</code>
<code> </code><code>defer response.Body.Close()</code>
<code> </code><code>body,_ := ioutil.ReadAll(response.Body)</code>
<code> </code><code>fmt.Println(</code><code>string</code><code>(body))</code>
<code>}</code>
<code> </code>
除了使用這三個函數來建立一個簡單用戶端,還可以使用:
http.Client和http.NewRequest來模拟請求
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<code>package main</code>
<code> </code><code>client := &http.Client{}</code>
<code> </code><code>reqest, _ := http.NewRequest(</code><code>"GET"</code><code>, </code><code>"http://www.baidu.com"</code><code>, nil)</code>
<code> </code>
<code> </code><code>reqest.Header.Set(</code><code>"Accept"</code><code>,</code><code>"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"</code><code>)</code>
<code> </code><code>reqest.Header.Set(</code><code>"Accept-Charset"</code><code>,</code><code>"GBK,utf-8;q=0.7,*;q=0.3"</code><code>)</code>
<code> </code><code>reqest.Header.Set(</code><code>"Accept-Encoding"</code><code>,</code><code>"gzip,deflate,sdch"</code><code>)</code>
<code> </code><code>reqest.Header.Set(</code><code>"Accept-Language"</code><code>,</code><code>"zh-CN,zh;q=0.8"</code><code>)</code>
<code> </code><code>reqest.Header.Set(</code><code>"Cache-Control"</code><code>,</code><code>"max-age=0"</code><code>)</code>
<code> </code><code>reqest.Header.Set(</code><code>"Connection"</code><code>,</code><code>"keep-alive"</code><code>)</code>
<code> </code><code>response,_ := client.Do(reqest)</code>
<code> </code><code>if</code> <code>response.StatusCode == 200 {</code>
<code> </code><code>body, _ := ioutil.ReadAll(response.Body)</code>
<code> </code><code>bodystr := </code><code>string</code><code>(body);</code>
<code> </code><code>fmt.Println(bodystr)</code>
<code> </code><code>}</code>
<a href="http://images.cnblogs.com/cnblogs_com/yjf512/201206/201206182159571172.png"></a>
http包封裝地非常bt,隻需要兩行!!:
<code>func SayHello(w http.ResponseWriter, req *http.Request) {</code>
<code> </code><code>w.Write([]</code><code>byte</code><code>(</code><code>"Hello"</code><code>))</code>
<code> </code><code>http.HandleFunc(</code><code>"/hello"</code><code>, SayHello)</code>
<code> </code><code>http.ListenAndServe(</code><code>":8001"</code><code>, nil)</code>
進行端口的監聽:http.ListenAndServe(":8001", nil)
注冊路徑處理函數:http.HandleFunc("/hello", SayHello)
處理函數:func SayHello(w http.ResponseWriter, req *http.Request)
看看這個文章:
<a href="http://groups.google.com/group/golang-nuts/browse_thread/thread/cde2cc6278cefc90">http://groups.google.com/group/golang-nuts/browse_thread/thread/cde2cc6278cefc90</a>
node.js is 45% faster than golang(确實傷心)
golang服務端的效率确實沒有node.js高,幾乎是它的一半。但話說回來,如果一些并發量不是很大的site,還是可以使用golang做伺服器的。
本文轉自軒脈刃部落格園部落格,原文連結:http://www.cnblogs.com/yjf512/archive/2012/06/18/2554066.html,如需轉載請自行聯系原作者