Go实战--golang中使用WebSocket实时聊天室(gorilla/websocket、nkovacs/go-socket.io)

websocket

在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

我大概调研了一下目前在go生态下使用websocket的方案,感觉websocket这个库是比较好用的。文档友好,API稳定。比较推荐使用。我们的代码也使用了这个库。

下面我们来写一个简单的websocket应用 hello_robot,它的作用很简单,就是你不管和它说什么,它都会说"hello" + 你输入的内容。

server

server有两个作用,第一是监听请求并发送我们的html文件,第二是监听用户输入内容并加以答复。

package main

import (
  "log"
  "net/http"
  "github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{}

我们需要一个Conn类型来表示我们的websocket连接。在客户端,我们需要用一个upgrader对象调用Upgrade函数来获得这个连接的指针。所以,我们首先需要创建这个Upgrader。

func main() {
    http.HandleFunc("/echo", echo)
    http.HandleFunc("/", home)
    log.Fatal(http.ListenAndServe("localhost:8080", nil))
}

在主函数中,我们设定了两个路由,一个是用于send我们的客户端html文件的,一个是用来监听用户输入内容的。最后,我们监听了本地的8080端口。

func home(w http.ResponseWriter, r *http.Request) {
  http.ServeFile(w, r, "home.html")
}

home函数用于发送客户端html文件。

func echo( w http.ResponseWriter, r *http.Request){
        c, _ := upgrader.Upgrade(w, r, nil)
    defer c.Close()
    for {
        mt, message, _ := c.ReadMessage()
            c.WriteMessage(mt, append([]byte("hello "),message[:]...))
    }
}

echo函数负责处理我们的websocket连接。首先,我们调用upgrader.Upgrade(w, r, nil)获得这个连接的指针。然后,我们进入一个循环,不停的读取连接中传来的信息,当有信息传来时,对信息处理后返回给客户端。这里有一点要注意,就是c.ReadMessage()是阻塞的,,也就是说,当有消息来时,它后面的代码才会被执行。

客户端

ws = new WebSocket("ws://127.0.0.1:8080/echo");
ws.onopen = function(evt) {...}
ws.onmessage = function(evt) {...}            
ws.onerror = function(evt) {...}
document.getElementById("send").onclick = function(evt) {
    if (!ws) {return false;}
    ws.send(input.value);
    return;
};

客户端(前端代码)很简单,这里我只写一个框架。首先,用new WebSocket(...)建立一个连接,并为这个连接绑定几个函数,这里我们可以设定onopen(建立连接),onmessage(收到服务端消息),onerror(发生错误)。然后,我们可以给我们的send按钮绑定单击事件,单击后发送数据到后台。

posted on 2018-12-18 10:51  &大飞  阅读(3409)  评论(0编辑  收藏  举报

导航