Go HTTP服务器
- 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服务器的更多相关文章
- App开发:模拟服务器数据接口 - MockApi
为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...
- 闰秒导致MySQL服务器的CPU sys过高
今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...
- 闲来无聊,研究一下Web服务器 的源程序
web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...
- SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]
目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...
- 使用 Nodejs 搭建简单的Web服务器
使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...
- 通过ProGet搭建一个内部的Nuget服务器
.NET Core项目完全使用Nuget 管理组件之间的依赖关系,Nuget已经成为.NET 生态系统中不可或缺的一个组件,从项目角度,将项目中各种组件的引用统统交给NuGet,添加组件/删除组件/以 ...
- 谈谈如何使用Netty开发实现高性能的RPC服务器
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...
- 游戏服务器菜鸟之C#初探一游戏服务
本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...
- 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...
- SQL Server 无法连接到服务器。SQL Server 复制需要有实际的服务器名称才能连接到服务器。请指定实际的服务器名称。
异常处理汇总-数据库系列 http://www.cnblogs.com/dunitian/p/4522990.html SQL性能优化汇总篇:http://www.cnblogs.com/dunit ...
随机推荐
- 对于PHP面试知识点的小结
基础篇 了解大部分数组处理函数 字符串处理函数(区别 mb_ 系列函数) & 引用,结合案例分析 == 与 === 区别 isset 与 empty 区别 全部魔术函数理解 static.$t ...
- .net 资源释放(托管资源和非托管资源)
1.托管资源 像int.float.DateTime等都是托管资源:net中80%的资源都是托管资源: 托管资源的回收通过GC(垃圾回收器)自动释放分配给该对象的内存,但无法预测进行垃圾回收的时间,我 ...
- 使用sublime 正则匹配替换大批量代码
1,在使用Django框架时,导入之前没有使用框架完成的网页,这时会遇到静态文件地址不匹配的问题,需要大量修改. 研究了一下sublime编译器,大家都使用正则匹配替换 2,位置在查找--替换与匹配, ...
- loadtxt()函数的糟心历程
原计划:导入一个csv文件,然后算出平均值 import numpy as np c=np.loadtxt('d:\python36\data.csv', delimiter=',', usecols ...
- java安装jdk错误1316 指定的账户已存在
java安装jdk错误1316 指定的账户已存在 处理步骤: 1.卸载jdk,成功后重启 2.删除注册表中文件夹 (1)\HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft文件夹 ...
- nginx 502 bad gateway 问题处理集锦
一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致5 ...
- MyBatis 源码分析系列文章导读
1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...
- Flask中的before_request after_request
1.@app.before_request 在请求(request)之前做出响应 @app.before_request 也是一个装饰器,他所装饰的函数,都会在请求进入视图函数之前执行 2.@app. ...
- 走你!Github 开源整合
加入知识星球,最好的分享交流平台哦~ <我的知识星球,最好的分享交流平台>,一年的服务平台,对于一个成年人来说,就是小费了(更多详情,请点击文章了解)~ 走你!Github 开源整合 1. ...
- ie8兼容视频播放的探索(探索过程稍微有点长,时间紧迫和耐心稍微差一点点的小伙伴直接往下拉)
需求: 前几天接到一个需求,需要在网页中嵌入视频,并且要兼容ie8:然后我就开始了如下的探索...... 探索过程: 我先思考有什么方法可以在网页中嵌入视频,然后找到2种常用的方法——video标签和 ...