gorilla

用 Go 编写一个简单的 WebSocket 推送服务

依然范特西╮ 提交于 2020-04-27 22:22:04
用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取。 背景 最近拿到需求要在网页上展示报警信息。以往报警信息都是通过短信,微信和 App 推送给用户的,现在要让登录用户在网页端也能实时接收到报警推送。 依稀记得以前工作的时候遇到过类似的需求。因为以前的浏览器标准比较陈旧,并且那时用 Java 较多,所以那时候解决这个问题就用了 Comet4J。具体的原理就是长轮询,长链接。但现在毕竟 html5 流行开来了,IE 都被 Edge 接替了,再用以前这种技术就显得过时。 很早以前就听过 WebSocket 的大名,但因为那时很多用户的浏览器还不支持,所以对这个技术也就是浅尝辄止,没有太深入研究过。现在趁着项目需要,就来稍微深入了解一下。 websocket 简介 以往浏览器要获取服务端数据,都是通过发送 HTTP 请求,然后等待服务端回应的。也就是说浏览器端一直是整个请求的发起者,只有它主动,才能获取到数据。而要让浏览器一侧能够获取到服务端的实时数据,就需要不停地向服务端发起请求。虽然大多数情况下并没有获取到实际数据,但这大大增加了网络压力,对于服务端来说压力也直线上升。 后来我们学会了使用长连接 + 长轮询的方式。换句话说,也就是延长 HTTP 请求的存在时间,尽量保持 HTTP 连接

golang gorilla websocket例子

一个人想着一个人 提交于 2020-04-27 22:04:11
WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。 WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范。 在golang语言中,目前有两种比较常用的实现方式:一个是golang自带的库,另一个是gorilla,功能强大。 golang自带库的使用例子可参考以前的博文: Golang如何使用websocket 本文以gorilla为例,介绍websocket的使用。 下载gorilla # go get github.com/gorilla/websocket 下面例子中主要包括两部分,server和client。 client部分又包括:web client(浏览器)和非web client。 server server端是一个HTTP 服务器,监听8080端口。 当接收到连接请求后,将连接使用的http协议升级为websocket协议。后续通信过程中,使用websocket进行通信。 对每个连接,server端等待读取数据,读到数据后,打印数据,然后,将数据又发送给client. server启动方式 # go run server. go server.go代码如下: // Copyright 2015 The Gorilla

go的http默认开启tcp keepalive为15秒

為{幸葍}努か 提交于 2020-02-28 07:11:36
问题 http server: package main import ( "log" "net/http" ) func main() { // 启动HTTP服务 addr := "127.0.0.1:8080" // 添加agent的websocket处理 http.HandleFunc("/agent", agentHandler) err := http.ListenAndServe(addr, nil) log.Fatal(err) } func agentHandler(w http.ResponseWriter, r *http.Request) { } http client用telnet模拟(不涉及http消息的收发,只是连接) telnet 127.0.0.1 8080 用tcpdump和strace发现server端开启了15秒的tcp keepalive,但是看代码只有默认为30秒的设置,很奇怪: $ strace ./s 2>&1 | grep setsockopt setsockopt(3, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 // 上面是客户端连接前输出的,下面是客户端连接后输出的 setsockopt(4,

Combining net/http and fasthttp

时光总嘲笑我的痴心妄想 提交于 2020-01-17 15:00:20
问题 I was looking for a fast framework for go and I stumbled upon fasthttp https://github.com/valyala/fasthttp which is according to the developer and the benchmark is 10x faster than Golang net/http package. I'm already familiar with gorilla toolkit and other net/http based frameworks like gin-gonic, goji, and gocraft. My question is: Is it possible to mix net/http framework / toolkits with fasthttp for example I would like to use some gorilla packages with echo / iris (fasthttp frameworks)? 回答1

cannot get gorilla session value by key

删除回忆录丶 提交于 2020-01-14 08:45:08
问题 I cannot get value from session this way, it is nil : session := initSession(r) valWithOutType := session.Values[key] Full code: package main import ( "fmt" "github.com/gorilla/mux" "github.com/gorilla/sessions" "log" "net/http" ) func main() { rtr := mux.NewRouter() rtr.HandleFunc("/setSession", handler1).Methods("GET") rtr.HandleFunc("/getSession", handler2).Methods("GET") http.Handle("/", rtr) log.Println("Listening...") http.ListenAndServe(":3000", http.DefaultServeMux) } func handler1(w

20 个有用的 Go 语言微服务开发框架吐血总结!!!

匆匆过客 提交于 2020-01-08 16:05:14
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 点击这里,查看 剩余10个高效有用的Go 语言微服务开发框架 Beego https://beego.me/ Beego 框架提供了很多标准附加功能,例如全功能路由器和可用于执行 CRUD 操作的对象到数据库映射工具。Bee 是 Beego 爱好者的最爱,它是一个快速而强大的命令行工具,用于构建、更新、打包和部署应用程序。Bee 可以从模板生成源代码,并保持数据库的最新状态。 Buffalo https://gobuffalo.io/en Buffalo 团队需要能够将 Web 应用程序的所有部分组装在一起的东西,包括应用程序本身的一些设计。他们把能够安装在一起的很多部件叫作“生态系统”。如果你想要路由——很少有人不需要——Buffalo 就包含了 Gorilla/Mux。如果你需要模板,Buffalo 倾向于使用 Plush,而不是使用内置的 Go 语言模板机制。数据库连接模块集合 Pop 可以帮你将数据库信息转换为 Go 对象。你还可以找到连接数据库、处理 cookie 以及完成其他任务的标准方法。 Cobra https://github.com/spf13/cobra 有时候,你只需要一个命令行界面。Cobra 提供了 CLI 的所有标准功能,因此你不必浪费时间实现代码来查找 -h 或 -help 标志

How to capture os signals like ctrl+c and send them through gorilla websocket in go

。_饼干妹妹 提交于 2020-01-06 05:15:35
问题 I am a newbie for go and websockets. I am trying to take input character by character and writing them to websocket. I even want to take ctrl+c as input and write it to websocket. func (c *poc) writePump() { var err error exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run() exec.Command("stty", "-F", "/dev/tty", "-echo").Run() defer exec.Command("stty", "-F", "/dev/tty", "echo").Run() var b = make([]byte, 1) d := make(chan os.Signal, 1) signal.Notify(d, os.Interrupt) for { os

How to call a route by its name from inside a handler?

那年仲夏 提交于 2020-01-02 09:20:07
问题 How do I properly refer to route names from inside handlers? Should mux.NewRouter() be assigned globally instead of standing inside a function? func AnotherHandler(writer http.ResponseWriter, req *http.Request) { url, _ := r.Get("home") // I suppose this 'r' should refer to the router http.Redirect(writer, req, url, 302) } func main() { r := mux.NewRouter() r.HandleFunc("/", HomeHandler).Name("home") r.HandleFunc("/nothome/", AnotherHandler).Name("another") http.Handle("/", r) http

Gorilla Mux router from inside handler only works once then gives 404 page not found

允我心安 提交于 2019-12-30 11:21:23
问题 I'm using Gorilla mux as my router and I'm having a very strange behaviour. On the first request to the server, I get a valid response. But on subsequent requests, I receive a 404 page not found . There are no errors in the console. My code is pretty straightforward (it can be copy-pasted to test it right out): package main import ( "fmt" "github.com/gorilla/mux" "log" "net/http" ) func main() { router := mux.NewRouter() router.HandleFunc("/", RootHandler).Name("root") http.Handle("/", router