Я использовал это так:
...
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 прочитать сообщение?