Go 如何将一些事件更新从http处理程序发送到WebSocket处理程序

Go 如何将一些事件更新从http处理程序发送到WebSocket处理程序,go,websocket,Go,Websocket,我是一个非常新的语言爱好者,我试着把我的头脑集中在频道上。为了澄清我的理解,我看了一些视频教程,读了一些书,但当涉及到实际编码和使用Go编码的web应用程序中的频道时,我仍然感到困惑 我想做的是有两个URL: 通常的正常GET或POST URL,用于显示或获取值和 处理它。在后端做一些处理,我希望 正在处理将在websocket更新中发送到同一服务器的输出 URL,因此不需要刷新/重新加载窗口 基于Gorilla包的websockets URL 以下是迄今为止我尝试过的测试代码,它仍然是我试图提

我是一个非常新的语言爱好者,我试着把我的头脑集中在频道上。为了澄清我的理解,我看了一些视频教程,读了一些书,但当涉及到实际编码和使用Go编码的web应用程序中的频道时,我仍然感到困惑

我想做的是有两个URL:

  • 通常的正常GET或POST URL,用于显示或获取值和 处理它。在后端做一些处理,我希望 正在处理将在websocket更新中发送到同一服务器的输出 URL,因此不需要刷新/重新加载窗口
  • 基于Gorilla包的websockets URL
  • 以下是迄今为止我尝试过的测试代码,它仍然是我试图提出解决方案的混乱代码的精简版本:

    //文件main.go
    包干管
    进口(
    “io”
    “net/http”
    “fmt”
    “数学/兰德”
    “日志”
    “时间”
    “github.com/gorilla/websocket”
    )
    func日志(f http.HandlerFunc)http.HandlerFunc{
    return func(w http.ResponseWriter,r*http.Request){
    log.Println(r.URL.Path)
    如果r.URL.Path=`/ws`{
    Println(“从ws://localhost:8080/ws访问WebSocket”)
    }
    f(w,r)
    }
    }
    类型hotcat int
    func(c hotcat)ServeHTTP(res http.ResponseWriter,req*http.Request){
    io.WriteString(标题为“cat”)
    //这里的一些代码是我想传递给websockets url ws://localhost:8080/ws的输出
    n:=时间消耗工作(4)
    fmt.Println(“来自类别:,n的随机数打印)
    //示例:我需要将n的值传递给ws://localhost:8080/ws,我该如何做?
    //其他一些示例测试代码只是给出了HotcatHTTP处理程序的一些随机输出
    //希望将其输出传递到ws://localhost:8080/ws,以便在浏览器中的Websockets输出中打印
    go func(){
    输出:=制造(成串)
    go func(){
    对于i:=0;;i++{
    
    我想我解决了它。至少它是按照我想象的代码来做我想让它做的事情,即使它可能不是正确的做事方式。正确的做事方式或高效的做事方式,我想你们中的许多人可能会纠正我,帮我这么做,我希望如此,所以如果你愿意,请评论并纠正我认为这是错误的或低效的

    我就是这样解决的:

    我查看了gorilla的websocket示例的
    echo
    example(),并从
    clients.go
    文件中获取了基本的代码,该文件作为客户端连接到websocket

    我的最终目标是将事件更新从另一个http句柄发送到websocket,因此我模拟了控制台输出中某个字符串的打印日志示例

    这是我在Mat Ryer聊天示例代码的
    main.go
    文件中所做的更改:

    //ServeHTTP处理HTTP请求。
    func(t*templateHandler)ServeHTTP(w http.ResponseWriter,r*http.Request){
    t、 once.Do(func(){
    t、 templ=template.Must(template.ParseFiles(filepath.Join(“templates”,t.filename)))
    })
    fmt.Println(右主机)
    t、 模板执行(w,r)
    //创建与websocket拨号器一起使用的URL方案
    //连接到ws://localhost:8080/room
    u:=url.url{Scheme:“ws”,主机:“localhost:8080”,路径:“/room”}
    log.Printf(“连接到%s”,u.String())
    //从go代码**作为客户端**启动websocket连接以连接聊天室
    c、 _u,err:=websocket.DefaultDialer.Dial(u.String(),nil)
    如果错误!=零{
    log.Fatal(“拨号:”,错误)
    }
    go func(){
    对于i:=0;i<10;i++{
    time.Sleep(time.Duration(rand.Intn(8e3))*time.毫秒)
    //只是在命令行中打印同一消息的日志。最好忽略它。
    //Println(“将自动hello从根ServeHTTP句柄发送到网页!”)
    //将消息作为文本消息写入web套接字连接
    //它将显示在聊天框中
    错误:=c.WriteMessage(websocket.TextMessage,[]字节(“将自动hello从根ServeHTTP句柄发送到网页!”)
    如果错误!=零{
    log.Println(“写入:,错误)
    返回
    }
    }
    }()
    }
    
    构建二进制文件后运行此代码将在控制台中打印以下示例输出:

    GoldenBook:mychat02 satinder$。/chat
    2019/03/31 03:44:27在:8080上启动web服务器
    本地主机:8080
    2019/03/31 03:44:31连接到ws://localhost:8080/room
    新客户加入
    新客户加入
    2019/03/31 03:44:33从根ServeHTTP句柄向网页发送自动hello!
    收到消息:将自动hello从根ServeHTTP句柄发送到网页!
    --发送给客户
    --发送给客户
    2019/03/31 03:44:36从根ServeHTTP句柄向网页发送自动hello!
    收到消息:将自动hello从根ServeHTTP句柄发送到网页!
    --发送给客户
    --发送给客户
    2019/03/31 03:44:43从根ServeHTTP句柄向网页发送自动hello!
    收到消息:将自动hello从根ServeHTTP句柄发送到网页!
    --发送给客户
    --发送给客户
    2019/03/31 03:44:45从根ServeHTTP句柄向网页发送自动hello!
    收到消息:将自动hello从根ServeHTTP句柄发送到网页!
    --发送给客户
    --发送给客户
    2019/03/31 03:44:45从根ServeHTTP句柄向网页发送自动hello!
    收到消息:将自动hello从根ServeHTTP句柄发送到网页!
    --发送给客户
    --发送给客户
    收到的信息:你好
    --发送给客户
    --发送给客户
    2019/03/31 03:44:48从根ServeHTTP句柄向网页发送自动hello!
    收到消息:将自动hello从根ServeHTTP句柄发送到网页!
    --发送给客户
    --发送给客户
    2019/03/31 03:44:48从根ServeHTTP句柄向网页发送自动hello!
    收到的信息: