浏览器收到 Websocket 输出,抱怨"标头值中的 UTF-8 序列无效"



当我在浏览器中加载页面时,页面得到了正确的服务。当javascript执行时,Chrome的控制台输出显示:

Invalid UTF-8 sequence in header value 

我已经搜索了这个字符串,但无法找到golang的任何提及。

我怎么去告诉golang不写unicode字符到web套接字?

我认为这是问题的原因,因为"Network"选项卡只显示了一个空的请求和响应。


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("Reqn");
};

编辑:

根据@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()  %#vn", 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  %#vn", webSck)
  }
}

这个问题是否与code.google.com/p/go.net/websocket最近的变化有关?

https://code.google.com/p/go/source/detail?r=1e65ca1b2499c473ec267ca1d6759b3dc920a599&回购=净

很抱歉以回答的形式评论,我还不能评论…

你在websocket配置上设置了Sec-WebSocket-Protocol头吗?(https://code.google.com/p/go/source/browse/websocket/websocket.go?repo=net#74 and https://www.rfc-editor.org/rfc/rfc6455#page-59)

这个错误信息似乎在谷歌上多次出现,与该标题不兼容或冲突有关。

类似:

func wsHandler(webSck *websocket.Conn) {
  webSck.Config.Header.Add("Sec-WebSocket-Protocol", "chat")
  fmt.Fprint(webSck, "Rpy")
  fmt.Println("Sent "Rpy" to web socket", webSck)
  //more code here
}

另外,我认为最好使用websocket (https://code.google.com/p/go/source/browse/websocket/websocket.go?repo=net#205)上的Write函数,因为它封装/转换写入数据为帧。

更像是:

func wsHandler(webSck *websocket.Conn) {
  webSck.Config.Header.Add("Sec-WebSocket-Protocol", "chat")
  _, _ = webSck.Write("Rpy")
  fmt.Println("Sent "Rpy" to web socket")
  //more code here
}

但是显然检查Write!

希望对你有帮助。

编辑:删除多余的"从fmt。Println。

相关内容

  • 没有找到相关文章

最新更新