Я делал это так:
...
ws, err := websocket.Dial(url, "", origin)
...
var buffer = make([]byte, 512)
var rs = make([]byte, 0, 512)
L:
for {
m, err := ws.Read(buffer)
if err != nil {
if err == io.EOF {
break L
}
fmt.Println(err.Error())
return
}
rs = append(rs, buffer[:m]...)
if m < 512 {
break L
}
}
У этого есть ошибка: если длина сообщения ровно 512, или 1024, или 2048... цикл никогда не прерывается; он застрянет на ws.Read()
и будет ждать, не бросая io.EOF
.
Впоследствии я заметил, что ws.Len()
всегда длиннее сообщения на 4.
Я переписал код так:
var buffer = make([]byte, 512)
var rs = make([]byte, 0, 512)
var sum = 0
L:
for {
m, err := ws.Read(buffer)
if err != nil {
if err == io.EOF {
break L
}
fmt.Println(err.Error())
return
}
rs = append(rs, buffer[:m]...)
sum+=m
if sum >= ws.Len()-4 {
break L
}
}
Этот способ в порядке.
Но число 4
— это магический код.
Есть ли способ найти максимальную длину сообщения?
Некоторые друзья предлагают отделить пакет сообщения, но я думаю, что WebSocket не должен рассматривать зависание или разделение пакета.
Каков наиболее правильный способ чтения сообщения клиентом WebSocket?