教您构建一个简单的Go Web服务器

发布者:上海IT外包来源:http://www.lanmon.net点击数:993

今天我将分享一篇文章来构建一个GO Web服务器,HelloWorld !!
去语言标准库 -  net/http
学习Go语言有一个很好的起点。 Go语言官方文档非常详细。今天,我们正在学习的Go Web服务器需要正式使用Go语言提供的标准库net/http。 HTTP客户端通过http包提供。并执行服务器。同时使用此包可以轻松设置和操作Web路由,静态文件,模板,cookie和其他数据。如果http的概念不太清楚,朋友可以自己谷歌。
Http包构建一个Web服务器
包主
进口(
'FMT'
净/HTTP'
“串”
“日志”

Func sayhelloName(w http.ResponseWriter,r * http.Request){
r.ParseForm()//解析参数,默认不解析
fmt.Println(r.Form)//该信息是输出到服务器的打印信息。
fmt.Println('path',r.URL.Path)
fmt.Println('scheme',r.URL.Scheme)
fmt.Println(r.Form [ 'url_long'])
对于k,v:=范围r.Form {
fmt.Println('key:',k)
fmt.Println('val:',strings.Join(v,''))
}fmt.Fprintf(w,'Hello Wrold!')//这写入w并输出到客户端。
}
Func main(){
http.HandleFunc('/',sayhelloName)//设置要访问的路由
Err:=http.ListenAndServe(': 9090',nil)//设置监听端口
如果错误!=nil {
log.Fatal('ListenAndServe:',错误)
}
}
在IDE中编译上述代码并成功运行后,我们可以在此时侦听端口9090上的http链接请求。
在上面的图片中,我们在浏览器中输入了http://localhost: 9090,您可以在浏览器页面中看到Hello World!
这时,如果我们在浏览器地址后添加一些参数:http://localhost: 9090? url_long=111&url_long=222,看看浏览器输出的内容是什么?服务器的输出是什么?
在浏览器中输出图像
服务器端输出图像
我们看到了上面的代码,编写一个Web服务器非常简单,只需调用http包的两个函数即可。
如果您之前是.NET程序员,您可能会问,是不是我们的IIS服务器需要? Go不需要这个,因为他直接侦听TCP端口。
我们看到Go运行带有几行代码的Web服务,而Web服务具有支持高并发性的功能。现在已经设置了Web服务,现在让我们了解这项服务的工作原理。
关于Web如何工作的几个概念
以下是服务器段的概念
请求:用户请求的信息,用于解析用户的请求信息,包括post,get,cookie,url等。
响应:服务器需要反馈给客户端的信息。
Conn:用户的请求链接每次
处理程序:处理请求和生成返回信息的处理逻辑
分析http包的运行机制
Go实现Web服务的工作模式流程图
在这个过程中,我们需要知道以下三个问题,然后我们才知道Go如何使Web运行。
怎么听港口?
通过上面的代码,我们看到Go通过函数ListenAndServe处理这些事情。Rational:初始化服务器对象,然后调用net.Listen('tcp',addr),也就是说,底层TCP协议用于构建服务。
然后监控我们设置的端口。
去http包源,这里我们可以看到整个http进程
Func(srv * Server)服务(l net.Listener)错误{
推迟l.Close()
Var tempDelay time.Duration //接受失败时的睡眠时间
对于{
Rw,e:=l.Accept()
如果e!=nil {
如果是,则确定:=e。(net.Error); ok && ne.Temporary(){
如果tempDelay==0 {
tempDelay=5 * time.Millisecond
} else {
tempDelay *=2
}
如果max:=1 * time.Second; tempDelay>
最大{
tempDelay=max
}
log.Printf('http:接受错误:%v;在%v'中重试,e,tempDelay)
time.Sleep(tempDelay)
继续
}
返回e
}
tempDelay=0
如果srv.ReadTimeout!=0 {
rw.SetReadDeadline(time.Now()。添加(srv.ReadTimeout))}
如果srv.WriteTimeout!=0 {
rw.SetWriteDeadline(time.Now()。添加(srv.WriteTimeout))
}
c,错误:=srv.newConn(rw)
如果错误!=nil {
继续
}
去c.serve()
}
恐慌('未达到')
}
我如何收到客户请求?
在上面的代码执行监视端口之后,调用srv.Serve(net.Listener)函数。该功能用于处理接收客户端的请求信息。这个函数启动for {},首先通过Listener接收请求,然后创建一个Conn,最后单独打开一个goroutine,将请求的数据作为参数投放到conn服务:go c.serve()。这是高并发性,用户的每个请求都在一个新的goroutine中服务,互不影响。
如何分配处理程序?
Conn首先解析请求: c.readRequest(),然后获取相应的处理程序:处理程序:=c.server.Handler,这是我们调用函数ListenAndServe时刚刚调用的第二个参数。前面的例子传递了nil。那是空的,那么默认的handler=DefaultServeMux,那么这个变量用于什么?是的,这个变量是一个路由器,用于匹配url跳转到相应的句柄函数,然后我们设置了这个吗?我们调用的代码中的第一句不调用http.HandleFunc('/',sayhelloName)。这个函数是注册请求/路由规则,当请求uri为'/'时,路由将转到函数sayhelloName,DefaultServeMux将调用ServeHTTP方法,这个方法实际上是调用sayhelloName本身,最后通过编写反馈信息反馈给客户。一个http连接处理流程
到目前为止,我们的三个问题都得到了回答。您现在已经了解Go如何使Web运行。
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部