Go语言 简单的http服务器示例

abv123456789 · · 3403 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一个简单的http服务器代码 

package main
import (
        "io"
        "net/http"
        "log"
)
func HelloServer(w http.ResponseWriter, req *http.Request) {
        io.WriteString(w, "hello, world!\n")
}
func main() {
        http.HandleFunc("/hello", HelloServer)
        err := http.ListenAndServe(":12345", nil)
        if err != nil {
                log.Fatal("ListenAndServe: ", err)
        }
} 

这里调用的是 http.HandleFunc函数,这个函数声明如下: 

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) 

这里用HelloServer实现HandleFunc函数的第二个参数。 

一个简单的http服务器计数器程序代码 

package main
import (
        "fmt"
        "net/http"
        "log"
)
type Counter struct {
        n int
}
func (ctr *Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) {
      ctr.n++
      fmt.Fprintf(c, "counter = %d\n", ctr.n)
}
func main() {
        http.Handle("/counter", new(Counter))
        log.Fatal("ListenAndServe: ", http.ListenAndServe(":12345", nil))
} 

这里调用的是http.Handle函数,这个函数声明如下: 

func Handle(pattern string, handler Handler) 

说明:几乎任何东西都可加以方法,几乎任何东西都可满足某界面,http包定义的Handler界面就是这样,任何物件实现了Handler都可服务 HTTP请求。 

type Handler interface { 

ServeHTTP(ResponseWriter, *Request) 

} 

ResponseWriter 本身是个界面,它提供一些可访问的方法来返回客户的请求。这些方法包括标准的 Write 方法。因此 http.ResponseWriter 可用在io.Writer可以使用的地方。Request 是个结构,包含客户请求的一个解析过的表示。 

所以这里只要给 Counter实现ServeHTTP方法就可以服务HTTP请求了。 

上面的两个例子是http服务器的两种方式,写出来主要是为了对比下。 

两种方式都实现了类似这样的函数: handler func(ResponseWriter, *Request),但是第一个例子的函数名字不固定,可以随便起,第二个例子中的函数名字只能是ServeHTTP,其它的不行。

实现http文件共享 

文件服务器要用到 http.FileServer提供的Handler,下面的代码就是基于第二种方式实现的。这里就不多解释了,不懂的参考上面的例子,比较下或许有帮助。 

源代码如下: 

/*
File      : httpShareWithTrace.go
Author    : Mike
E-Mail    : Mike_Zhang@live.com
*/
package main
import (
    "net/http"
    "os"
    "strings"
    "log"
)
type TraceHandler struct {
    h http.Handler
}
func (r TraceHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
        println("get",req.URL.Path," from ",req.RemoteAddr)
        r.h.ServeHTTP(w, req)
}
func main() {
        port := "8080"//Default port 
        if len(os.Args)>1 { port = strings.Join(os.Args[1:2],"")}
        h := http.FileServer(http.Dir("."))
        http.Handle("/", TraceHandler{h})
        println("Listening on port ",port,"...")
        log.Fatal("ListenAndServe: ", http.ListenAndServe(":"+port, nil))
}

启动应用程序: 

 Web访问: 

 


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:abv123456789

查看原文:Go语言 简单的http服务器示例

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3403 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传