2

当我在浏览器中加载页面时,页面会正确提供。当 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)
  }
}
4

2 回答 2

2

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

https://code.google.com/p/go/source/detail?r=1e65ca1b2499c473ec267ca1d6759b3dc920a599&repo=net

于 2013-05-13T19:01:38.410 回答
0

抱歉以答案的形式发表评论,我还不能发表评论......

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

该错误消息似乎多次出现在 Google 上,与该标头不兼容或冲突有关。

就像是:

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 中删除无关的“,webSck”。

于 2013-05-12T15:00:37.353 回答