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   &大飞  阅读(3557)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示