golang websocket 入门

前端之家收集整理的这篇文章主要介绍了golang websocket 入门前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我们先写一个最简单的go http服务

  1. package main
  2.  
  3. import (
  4. "net/http"
  5. )
  6.  
  7. func main() {
  8. http.HandleFunc("/",func(w http.ResponseWriter,r *http.Request) {
  9. w.Write([]byte("hello world"))
  10. })
  11. http.ListenAndServe(":9000",nil)
  12. }

上面的太简单,就是一个http的服务,启动打开浏览器就可以输出hello world了,这是http,每次一个请求一个返回,虽然http的1.1版本已经支持keep-alive了,但如果想从服务发送到客户端,还是不行的,那么就诞生了websocket了。
现在改进一下代码

  1. package main
  2.  
  3. import (
  4. "net/http"
  5. "github.com/gorilla/websocket"
  6. "fmt"
  7. )
  8. var upgrade = websocket.Upgrader{}
  9.  
  10. func main() {
  11. http.HandleFunc("/",r *http.Request) {
  12. w.Write([]byte("hello world"))
  13. })
  14.  
  15. http.HandleFunc("/v1/ws",r *http.Request) {
  16. conn,_ := upgrade.Upgrade(w,r,nil)
  17. go func(conn *websocket.Conn) {
  18. for{
  19. //mtype :TextMessage=1/BinaryMessage=-2/CloseMessage=8/PingMessage=9/PongMessage=10
  20. mtype,msg,_:=conn.ReadMessage()
  21. switch mtype {
  22. case 1:
  23. conn.WriteMessage(mtype,msg)
  24. case 8:
  25. fmt.Println("close")
  26. }
  27. }
  28. }(conn)
  29.  
  30. })
  31. http.ListenAndServe(":9000",nil)
  32. }

这个里面如果请求的是v1/ws的话就进入websocket的,就是把用户的输入当做输出,返回到客户端。下面通过浏览器console测试一下

  1. var ws = new WebSocket("ws://127.0.0.1:9000/v1/ws")
  2. ws.addEventListener("message",function(e){console.log(e);});
  3. ws.send("123")

运行一下就可以看到效果。当然,如果你不想返回,只是在后端输出一下

  1. mtype,_:=conn.ReadMessage()
  2. fmt.Println(mtype,":",string(msg))

那么前端就收不到任何返回。

进一步,那么如何后端推送呢,

  1. http.HandleFunc("/v1/ws",func(w http.ResponseWriter,r *http.Request) {
  2. conn,_ := upgrade.Upgrade(w,nil)
  3. go func(conn *websocket.Conn) {
  4. ch :=time.Tick(5*time.Second)
  5. for range ch{
  6. fmt.Println("call")
  7. conn.WriteMessage(1,[]byte("abc"))
  8.  
  9. }
  10. }(conn)
  11.  
  12. })

这样只要前端绑定了这个message就可以定时收到后端的推送了。但是如果前端关闭ws.close()将不会收到推送了。
在结束这篇blog之前还要补充一点就是服务关闭,如果前端关闭,后端任然继续读取数据将会报错panic: repeated read on Failed websocket connection。因为无法读取到客户端的数据了。所以还要在第一个例子的地方加上一个异常处理

  1. mtype,err:=conn.ReadMessage()
  2. if err != nil{
  3. conn.Close()
  4. return
  5. }

第一篇入门就和大家分享到这来

猜你在找的Go相关文章