WedX - журнал о программировании и компьютерных науках

Как клиент WebSocket узнает, что сообщение было полностью прочитано?

Я делал это так:

    ...
    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?

05.03.2019

  • какой пакет вы использовали для этого подключения к веб-сокету? 05.03.2019
  • @ASHWINRAJEEV golang.org/x/protobuf/proto 05.03.2019

Ответы:


1

Похоже, вы используете пакет golang.org/x/net/websocket. Невозможно надежно определить границы сообщения с помощью метода Read этого пакета.

Чтобы исправить это, используйте websocket.Message для чтения сообщений.

var msg string
err := websocket.Message.Receive(ws, &msg)
if err != nil {
  // handle error
}
// msg is the message

Обратите внимание, что документация golang.org/x/net/websocket гласит:

В настоящее время в этом пакете отсутствуют некоторые функции, имеющиеся в альтернативном и более активно поддерживаемом пакете WebSocket:

https://godoc.org/github.com/gorilla/websocket

документация и примеры показывают, как читать сообщения.

05.03.2019
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]