Go 如何将一些事件更新从http处理程序发送到WebSocket处理程序
我是一个非常新的语言爱好者,我试着把我的头脑集中在频道上。为了澄清我的理解,我看了一些视频教程,读了一些书,但当涉及到实际编码和使用Go编码的web应用程序中的频道时,我仍然感到困惑 我想做的是有两个URL:Go 如何将一些事件更新从http处理程序发送到WebSocket处理程序,go,websocket,Go,Websocket,我是一个非常新的语言爱好者,我试着把我的头脑集中在频道上。为了澄清我的理解,我看了一些视频教程,读了一些书,但当涉及到实际编码和使用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!
收到的信息: