go - 通过 websocket 发送消息
问题描述
任务很简单:建立连接并向用户发送消息
在网上看了下,原来是这样的
联系
func echo(w http.ResponseWriter, r *http.Request) {
con, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Print("upgrade:", err)
return
}
defer con.Close()
for {
mt, message, err := con.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}
log.Printf("recv: %s", message)
err = con.WriteMessage(mt, message)
if err != nil {
log.Println("write:", err)
break
}
}
}
func main() {
flag.Parse()
log.SetFlags(0)
http.HandleFunc("/echo", echo)
}
从方法发送消息
jsonData, _ := json.Marshal(data)
users := make(map[string]*websocket.Conn)
_ = users[uid].WriteJSON(jsonData)
正如你可以想象的那样,它不起作用,我处于某种昏迷状态。你能告诉我,我真的在朝着正确的方向行事吗?我确定有人已经完成了这个非常简单的设置,请回复=)
解决方案
试试下面的代码,如果你迷路了,请问问题。
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/mux"
"github.com/gorilla/websocket"
"github.com/rs/cors"
)
var router = mux.NewRouter().StrictSlash(true)
var upgrader = websocket.Upgrader{
ReadBufferSize: 0,
WriteBufferSize: 0,
}
type tester struct {
Results int `json:"Results"`
ID int `json:"ID"`
User string `json:"User"`
}
var testers tester
var list = ""
func homePage(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Home Page")
}
func reader(conn *websocket.Conn) {
for {
//read in a message
messageType, p, err := conn.ReadMessage()
if err != nil {
fmt.Println(err)
return
}
//printing out the message in the server for clarity
fmt.Println(string(p))
list = string(p)
if err := conn.WriteMessage(messageType, p); err != nil {
log.Println(err)
return
}
}
}
func wsEndpoint(w http.ResponseWriter, r *http.Request) {
//This will determine whether or not an incoming request from
// a different domain is allowed to connect, and if it isn’t they’ll be hit with a CORS error.
upgrader.CheckOrigin = func(r *http.Request) bool { return true }
//upgrade this connection to a webSocket connection
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
} else {
// helpful log statement to show connections
log.Println("Client Connected")
for {
//read in a message
_, p, err := ws.ReadMessage()
if err != nil {
fmt.Println(err)
return
}
//printing out the message in the server for clarity
list = string(p)
fmt.Println(list)
}
}
}
// define a reader which will listen for
// new messages being sent to our WebSocket
// endpoint
func setupRoutes() {
router.HandleFunc("/", homePage)
router.HandleFunc("/ws", wsEndpoint)
}
func main() {
setupRoutes()
handler := cors.AllowAll().Handler(router)
log.Fatal(http.ListenAndServe(":8080", handler))
}
推荐阅读
- kubernetes - Kubernetes Pod 上的 CockroachDB 集群崩溃
- reactjs - 为什么 this.setState 在我的点击功能中没有更新?
- c++ - 为什么这个按位运算是“从'int'到'byte'的缩小转换”?- 阿杜诺
- javascript - body:after 出现在每个打印页面上
- swift - 如何在 Realm 对象上建模 Swift 字典属性?
- linux - 无法在 cpanel (Linux) 上运行 Elasticsearch
- javascript - 是否有某种方法可以将变量(特别是映射)从服务器端导入客户端(Socket.io)?
- php - Android:尝试上传到服务器上的 php 文件时,以 byte64 编码位图会产生内存错误
- elasticsearch - 我需要安装什么才能在 Kibana 中使用日志功能?
- java - 如何在Java中将两张图片叠加在一起?