读取golang websocket返回随机字节
我的节目:读取golang websocket返回随机字节,go,websocket,Go,Websocket,我的节目: package main import ( "fmt" "io" "log" "net" "github.com/gobwas/ws" ) func HandleConn(conn net.Conn) { for { header, err := ws.ReadHeader(conn) if err
package main
import (
"fmt"
"io"
"log"
"net"
"github.com/gobwas/ws"
)
func HandleConn(conn net.Conn) {
for {
header, err := ws.ReadHeader(conn)
if err != nil {
log.Fatal(err)
}
buf := make([]byte, header.Length)
_, err = io.ReadFull(conn, buf)
if err != nil {
log.Fatal(err)
}
fmt.Println(buf)
fmt.Println(string(buf))
}
}
func main() {
ln, err := net.Listen("tcp", "localhost:8080")
if err != nil {
log.Fatal(err)
}
for {
conn, err := ln.Accept()
if err != nil {
log.Fatal(err)
}
_, err = ws.Upgrade(conn)
if err != nil {
log.Fatal(err)
}
go HandleConn(conn)
}
}
我在浏览器控制台中执行以下操作:
let socket = new WebSocket("ws://127.0.0.1:8080")
socket.send("Hello world")
我在我的终端中看到随机字节。每次调用socket.send(“Hello world”)都会返回不同的字节。但是字节数组的长度始终等于字符串的长度。golang从哪里得到这些随机字节?我怎样才能解决这个问题?我的程序是文档中的一个示例。如果您不打算使用
wsutil
,则需要取消有效负载的掩码:
buff:=make([]字节,头.Length)
_,err=io.ReadFull(连接,buff)
如果出错!=零{
//处理错误
}
如果标题被屏蔽{
ws.Cipher(buff,header.Mask,0)
}
fmt.Println(字符串(浅黄色))
我不确定您指的是什么文档,或者您使用的是哪个websocket库,但没有一个流行的文档让您直接访问net.Conn
。唯一具有Update
功能的服务器(gorilla)接受HTTP请求和响应,而不是net.Conn
,并且不返回net.Conn
。你能提供一个最小的、可重复的例子吗?@Adrian我使用:。文件:。我在我的代码中使用tcp是因为零拷贝升级是必需的:可能值得一提的是,如果您重用头来写入客户端(例如,ws.WriteHeader(conn,header)
),那么您应该按照