关闭

Golang学习之net/http包

标签: gonethttpServer
301人阅读 评论(0) 收藏 举报
分类:

       使用net/http包快速创建一个HTTP服务器。

// file http_test1.go
package main 

import (
    "fmt"
    "net/http"
    "log"
)

func HandleIndex(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    fmt.Println("PATH: ", r.URL.Path)
    fmt.Println("SCHEME: ", r.URL.Scheme)
    fmt.Println("METHOD: ", r.Method)
    fmt.Println()

    fmt.Fprintf(w, "<h1>Index Page</h1>")
}

func main() {
    http.HandleFunc("/", HandleIndex)
    err := http.ListenAndServe(":8000", nil)
    if err != nil {
        log.Fatal("ERROR: ", err)
    }
}

       其实有时候语言无关紧要,原理大抵相同。此handler就如同Python的WSGI协议application(environ, start_response),如同Nodejs的callback(req,res)函数。并且他们底层都是基于socket(好像是的!!!)

$ go run http_test1.go

       在浏览器中输入127.0.0.1:8000可以看到浏览器显示:
这里写图片描述

       在终端上打印出如下信息:
这里写图片描述

       虽然我们没有像其他语言一样显式地监听端口,启动服务器,或者用socket来搭建tcp或udp服务器,用while循环来获取请求数据。但是我们不难发现服务的入口在http.ListenAndServe。我们来看一下源码,探讨它究竟做了什么工作。

$ godoc -src net/http ListenAndServe

       会打印出来两个相似的函数:

func (srv *Server) ListenAndServe() error {
    addr := srv.Addr
    if addr == "" {
        addr = ":http"
    }
    ln, err := net.Listen("tcp", addr)
    if err != nil {
        return err
    }
    return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})
}

func ListenAndServe(addr string, handler Handler) error {
    server := &Server{Addr: addr, Handler: handler}
    return server.ListenAndServe()
}

       不要觉得这两个同名的函数像C++或Java一样是重载函数,Go语言中是没有函数签名这个概念的。

       第一个函数func (srv *Server) ListenAndServe() error,这是type Server struct类型的一个方法,你可以理解为面向对象中的方法,属于Server类。

       而第二个函数func ListenAndServe(addr string, handler Handler) error则是一个普通函数,内部进行封装,更简洁地实现HTTP服务器。你可以看到它创建了Server类的一个对象,然后调用了刚才说的第一个函数。

       转自:http://blog.csdn.net/cc7756789w/article/details/51014076

0
0
查看评论

golang使用net/http实现一对客户端和服务器连接的例子

golang的net/http封装很强大,可惜网上的教程或者源码很少。这里简单实现了一对服务器和客户端的连接。 客户端代码如下: package main import ( "fmt" "io/ioutil" "net/http" &q...
  • su_sai
  • su_sai
  • 2016-04-18 00:58
  • 2029

golang-net/http源码分析之http server

golang-net/http源码分析之http server
  • screscent
  • screscent
  • 2016-12-12 15:52
  • 1661

golang 建立web服务器 http包源码详解

golang 建立web服务器 http包源码详解首先,熟悉http协议的都知道,http协议是基于TCP实现的。http服务器的工作方式大概就是监听socket端口,接受连接,获取到请求,处理请求,返回响应。所以,对应的会有几个部分 Request:用户请求的信息。post、get、url等这些信...
  • qq_24850089
  • qq_24850089
  • 2017-02-16 04:21
  • 1367

golang中net/http包用法

http包包含http客户端和服务端的实现,利用Get,Head,Post,以及PostForm实现HTTP或者HTTPS的请求. 当客户端使用完response body后必须使用close对其进行关闭.如下所示 resp, err := http.Get("http://exa...
  • chenbaoke
  • chenbaoke
  • 2015-01-16 20:29
  • 8498

golang的http包笔记

最近打算用golang做项目,看了一下golang的资料,顺便做一下笔记,以供参考,复习. 由于对golang的熟悉度还不是很高,写的有点生疏了,也希望能对大家有帮助吧. 示例源码: packagemain import(     "log&...
  • x87648510
  • x87648510
  • 2015-12-12 11:07
  • 989

GOLANG 实现的 fastcgi

server {         listen 80;         server_name go.dev;         root /root/go/src/godev; &...
  • peta
  • peta
  • 2013-12-06 20:04
  • 1342

go http包学习

go http包学习 go root下的~/goroot/pkg/.a文件和 ~/goroot/src/*.go文件的区别 net/http/client.go net/http/cookie.go 由于包下面的文件比较多这样写下来文档比较大,所以后面一个go文件写一篇笔记,写文档的目的是督促自己完...
  • textdemo123
  • textdemo123
  • 2016-12-02 19:07
  • 1694

Go net/http 超时机制完全手册

原文链接:http://colobu.com/2016/07/01/the-complete-guide-to-golang-net-http-timeouts/ 英文原始出处: The complete guide to Go net/http timeouts , ...
  • u013870094
  • u013870094
  • 2017-11-10 21:03
  • 207

Go网络编程之net/http包执行流程源码分析

1. http包建立web服务器 package main import (     "fmt"     "log"  ...
  • huwh_
  • huwh_
  • 2017-07-30 15:11
  • 736

golang net/http包使用

http客户端import “net/http” http包提供了HTTP客户端和服务端的实现。Get、Head、Post和PostForm函数发出HTTP/ HTTPS请求。package main import ( "fmt" "io/ioutil...
  • grassroots2011
  • grassroots2011
  • 2015-08-24 13:57
  • 1232
    个人资料
    • 访问:193122次
    • 积分:4105
    • 等级:
    • 排名:第8984名
    • 原创:178篇
    • 转载:176篇
    • 译文:1篇
    • 评论:18条
    博客专栏
    最新评论