• HTTP HandleFunc的简单使用
package main

import (
"log"
"net/http"
) func main() {
//注册一个函数,响应某一个路由
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello this is version 1!!"))
})
//这里可以单独写一个函数传递给当前的路由
http.HandleFunc("/bye", SayBye)
log.Println("Start version v1")
log.Fatal(http.ListenAndServe(":4000", nil)) }
func SayBye(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Bye bye, this is version v1"))
//进行一个流式传递,将字符串转换为byte类型
}
  • 自己定义mux并使用
package main

import (
"log"
"net/http"
) func main() {
mux := http.NewServeMux()
//自己创建servemux,然后使用自己的handle方法
mux.Handle("/", &myHandler{})
//默认的mux中根路由包含了所有的未匹配的路由
mux.HandleFunc("/bye", SayBye) log.Println("Start version v1")
log.Fatal(http.ListenAndServe(":4000", mux)) } type myHandler struct{} //自己定义handler结构
//实现myHandler的ServeHTPP方法
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello this is version 2!,the requeset URL is:" + r.URL.String()))
//这里可以打印出完整的URL,响应的都是根路由
//大部分web结构的路由都是在ServerHTTP的方法中实现的
} func SayBye(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Bye bye, this is version v2"))
//进行一个流式传递,将字符串转换为byte类型
}
  • ListenAndServe 函数
源码解析
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}
//这里可以看出我们可以自定义server对象,然后进行监听 //完整源码
package main import (
"log"
"net/http"
"time"
) func main() {
server := &http.Server{
Addr: ":4000",
WriteTimeout: 4 * time.Second,
}
mux := http.NewServeMux()
//自己创建servemux,然后使用自己的handle方法,mux就是实现了handler接口的一个变量
mux.Handle("/", &myHandler{})
//默认的mux中根路由包含了所有的未匹配的路由
mux.HandleFunc("/bye", SayBye)
//将mux集成到server当中,server.Handle也是handle类型的接口,所以可以直接赋值
server.Handler = mux log.Println("Start version v3")
log.Fatal(server.ListenAndServe()) } type myHandler struct{} //自己定义handler结构
//实现myHandler的ServeHTPP方法
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello this is version 3!,the requeset URL is:" + r.URL.String()))
//这里可以打印出完整的URL,响应的都是根路由
} func SayBye(w http.ResponseWriter, r *http.Request) {
time.Sleep(3 * time.Second)
w.Write([]byte("Bye bye, this is version v3"))
//进行一个流式传递,将字符串转换为byte类型
}
  • GO1.8的新功能,允许主动停止http服务器
package main

import (
"log"
"net/http"
"os"
"os/signal"
"time"
) func main() {
server := &http.Server{
Addr: ":4000",
WriteTimeout: 4 * time.Second,
}
quit := make(chan os.Signal)
//创建chan,用来指示我要退出这个服务器了,麻烦帮忙关闭一下
signal.Notify(quit, os.Interrupt)
//注册这个通知事件,一旦受到这个singal,发送一个对象到这个chan当中,当我接收到任意对象之后,我就知道服务器该退出了
mux := http.NewServeMux()
//自己创建servemux,然后使用自己的handle方法,mux就是实现了handler接口的一个变量
mux.Handle("/", &myHandler{})
//默认的mux中根路由包含了所有的未匹配的路由
mux.HandleFunc("/bye", SayBye)
//将mux集成到server当中,server.Handle也是handle类型的接口,所以可以直接赋值
server.Handler = mux
//创建一个gorouting 专门接收这个chan
go func() {
<-quit
if err := server.Close(); err != nil {
log.Fatal("Close server:", err)
}
}() log.Println("Start version v3")
err := server.ListenAndServe()
if err != nil {
if err == http.ErrServerClosed {
log.Print("Server closed under requeset!!")
} else {
log.Fatal("Server closed unexpecteed!!")
} }
log.Println("Server exit!!") } type myHandler struct{} //自己定义handler结构
//实现myHandler的ServeHTPP方法
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello this is version 3!,the requeset URL is:" + r.URL.String()))
//这里可以打印出完整的URL,响应的都是根路由
} func SayBye(w http.ResponseWriter, r *http.Request) {
time.Sleep(3 * time.Second)
w.Write([]byte("Bye bye, this is version v3"))
//进行一个流式传递,将字符串转换为byte类型
}
  • 基础模板的用法

Go HTTP服务器的更多相关文章

  1. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  2. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  3. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

  4. SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]

    目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...

  5. 使用 Nodejs 搭建简单的Web服务器

    使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...

  6. 通过ProGet搭建一个内部的Nuget服务器

    .NET Core项目完全使用Nuget 管理组件之间的依赖关系,Nuget已经成为.NET 生态系统中不可或缺的一个组件,从项目角度,将项目中各种组件的引用统统交给NuGet,添加组件/删除组件/以 ...

  7. 谈谈如何使用Netty开发实现高性能的RPC服务器

    RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...

  8. 游戏服务器菜鸟之C#初探一游戏服务

    本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...

  9. 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...

  10. SQL Server 无法连接到服务器。SQL Server 复制需要有实际的服务器名称才能连接到服务器。请指定实际的服务器名称。

    异常处理汇总-数据库系列  http://www.cnblogs.com/dunitian/p/4522990.html SQL性能优化汇总篇:http://www.cnblogs.com/dunit ...

随机推荐

  1. javaweb开发.常用的第三方包

      序号 开发包名称 描述 1 dom4j-1.6.1.jar dom4j用于操作XML文件 2 jaxen-1.1-beta-6.jar 用于解析XPath表达式 3 commons-beanuti ...

  2. 如何自行搭建一个威胁感知大脑 SIEM?| 硬创公开课

    如何自行搭建一个威胁感知大脑 SIEM?| 硬创公开课 本文作者:谢幺 2017-03-10 10:09 专题:硬创公开课 导语:十年安全产品经验的百度安全专家兜哥,手把手教你用开源项目搭建SIEM安 ...

  3. iOS10 UIImageWriteToSavedPhotosAlbum程序奔溃crash解决办法

    Xcode报错: This app has crashed because it attempted to access privacy-sensitive data without a usage ...

  4. 9. Bookshops in London 伦敦书店

    9. Bookshops in London 伦敦书店 (1) Londoner are greater readers.They buy vast numbers of newspapers and ...

  5. drf2 FBV和CBV

    FBV 基于函数的视图 CBV 基于类的视图 也就是说我们是用函数编写视图~还是类编写视图 urlpatterns = [ path('admin/', admin.site.urls), path( ...

  6. python_day1_程序交互

    程序交互 在编写程序过程中总会有程序与用户交互的场景出现,这里面提到python会使用一个方法:input 用法: 例如:请用户输入一个账号 input"Please input your ...

  7. div辅助线【完整版】

    ## <html> <head> <link rel="stylesheet" type="https://cdn.bootcss.com/ ...

  8. 小程序快捷键(mac中)

    快捷键 格式调整  - Ctrl+S:保存文件  - Ctrl+[, Ctrl+]:代码行缩进  - Ctrl+Shift+[, Ctrl+Shift+]:折叠打开代码块  - Ctrl+C Ctrl ...

  9. [Linux/Ubuntu] vi/vim 使用方法讲解

    vi/vim 基本使用方法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的 ...

  10. string Type

    Notes from C++ Primer Operations Operations of string support lots of operations of sequential conta ...