当我在浏览器中加载页面时,页面会正确提供。当 javascript 执行时,Chrome 的控制台输出显示:
Invalid UTF-8 sequence in header value
我已经搜索了该字符串,但找不到任何关于 golang 的提及。
我该如何告诉golang不要将unicode字符写入网络套接字?
我认为这是问题的原因,因为“网络”选项卡只显示一个空的请求和响应。
CCSSE:
main.go:
package main
import (
"fmt"
"net/http"
"log"
"code.google.com/p/go.net/websocket"
//"github.com/garyburd/go-websocket/websocket"
)
const listenAddress = "localhost:9999"
func wsHandler(webSck *websocket.Conn) {
fmt.Fprint(webSck, "Rpy")
fmt.Println("Sent \"Rpy\" to web socket", webSck)
//more code here
}
func main() {
http.Handle("/", http.FileServer(http.Dir("./static")))
http.Handle("/ws", websocket.Handler(wsHandler))
err := http.ListenAndServe(listenAddress, nil)
if err != nil {
log.Fatal(err)
}
}
静态/main.js
var socket = new WebSocket("ws://localhost:9999/ws");
socket.onopen = function() {
socket.onmessage = function(m) {
console.log("Received: " + m);
};
socket.send("Req\n");
};
编辑:
正如@Intermernet 所建议的,我已经设置了Sec-WebSocket-Protocol
标题。无济于事,仍然得到Invalid UTF-8 sequence in header value
.
另请注意,我需要这样做的原因webSck.Config().Header = make(http.Header)
是它nil
已通过日志声明确认webSck.Config()
。继续回答另一个问题——我为什么要这样做;是否有我在某处错过的初始化步骤?
func wsHandler(webSck *websocket.Conn) {
webSck.Config().Header = make(http.Header)
webSck.Config().Header.Add("Sec-WebSocket-Protocol", "chat")
fmt.Printf("ws.Config() %#v\n", webSck.Config())
var buf []byte;
buf = []byte("Rpy")
_, err := webSck.Write(buf)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Printf("Sent \"Rpy\" to web socket %#v\n", webSck)
}
}