如何創(chuàng)建來自任何域名/IP 地址的任何客戶端都可以與之通信的 WebSocket 服務器。我不想為了與服務器通信而打開具有服務器提供的自定義地址的頁面。目標是能夠通過瀏覽器擴展或任何意外的終結點與 WebSocket 服務器進行通信。server.gopackage mainimport ( "fmt" "net/http" "github.com/gorilla/websocket")var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024,}func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { fmt.Println(err) // no error just when websocket connecte from my domain } for { // Read message from browser msgType, msg, _ := conn.ReadMessage() // Print the message to the console fmt.Printf("%s sent: %s\n", conn.RemoteAddr(), string(msg)) // Write message back to browser if err = conn.WriteMessage(msgType, msg); err != nil { return } } }) http.HandleFunc("/client", func(w http.ResponseWriter, r *http.Request) { // I dont need this http.ServeFile(w, r, "client.html") }) http.ListenAndServe(":8080", nil)}客戶端.js<!DOCTYPE html><html> <head> <meta charset=utf8> <meta name=viewoirt content="width=device-width, initial-scale=1.0"> <title>click bot</title> </head><body><input id="input" type="text" /><button onclick="send()">Send</button><pre id="output"></pre><script> var input = document.getElementById("input"); var output = document.getElementById("output"); var socket = new WebSocket("ws://localhost:8080/"); socket.onopen = function () { output.innerHTML += "Status: Connected\n"; }; socket.onmessage = function (e) { output.innerHTML += "Server: " + e.data + "\n"; }; function send() { socket.send(input.value); input.value = ""; }</script></body></html>當我通過鏈接或通過瀏覽器擴展注入它進行連接時,一切都很好。但是當我將其注入另一個沒有相同IP地址的頁面時,它不起作用。例如:例如,當我在控制臺中鍵入:在我的域以外的域中。localhost:8080/clientwebsocket = new webSocket('ws://localhost: 8080')
1 回答
POPMUISE
TA貢獻1765條經(jīng)驗 獲得超5個贊
例如,當我在控制臺中鍵入內(nèi)容時:websocket = new webSocket('ws://localhost: 8080')在我的域以外的域中。
問題中的服務器代碼實現(xiàn)了同源策略。更改檢查源函數(shù)以允許來自任何源的連接:
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool { return true }
}
問題說,為了簡單起見,服務器代碼忽略了升級時的錯誤。如果服務器代碼記錄了錯誤,則問題會立即顯現(xiàn)出來。始終處理錯誤!
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Println(err)
return
}
- 1 回答
- 0 關注
- 150 瀏覽
添加回答
舉報
0/150
提交
取消
