2016-12-25 2 views
1

У меня есть клиент приложения (javascript) -сервер (golang), и соединение между ними происходит через websocket. Я планирую использовать двоичные сообщения, и я хочу создать свой собственный протокол для обмена сообщениями, как на этой странице protocol.Golang: работа с двоичными данными

Я уже понял это в javascript, используя DataView, но не в golang. Событие примитивного типа данных аналогично, как у них есть int8, uint8, int16, uint16 и т. Д., Я не могу понять это.

Это кадр сообщения:

1  Uint8  opcode 
2  Uint16  msg 

Это пример яваскрипта обработки входящего формы сообщения WebSocket с рамкой сообщения выше код:

websocket.onmessage = function(evt) { 
    var data = new DataView(evt.data); 
    var opcode = data.getUint8(0); 
    var msg = data.getUint16(1); 
} 

Можете ли вы показать мне, как это сделать в голанге? Я использую gorilla websocket. Я знаю, что прочитанное сообщение находится в []byte, но я не знаю, как его нарезать, как javascript с помощью DataView.

Благодаря

+0

Я рекомендую вам использовать [Protobuf] (https://developers.google.com/protocol-buffers/docs/gotutorial) или просто [JSON] (HTTP: // WWW. json.org/) –

+0

Спасибо за вашу рекомендацию, я уже делаю это с JSON раньше, но теперь это фаза оптимизации, поэтому мне нужно переключиться на двоичные данные. Я хочу решение с исходными двоичными данными, такими как мой пример в javascript. – billyzaelani

+0

время использования плоских буферов https://google.github.io/flatbuffers/flatbuffers_guide_use_go.html –

ответ

0

Для uint16 вам нужно бинарный пакет. Дважды проверьте, подходит ли LittleEndian.

package main 

import (
    "encoding/binary" 
) 

func main() { 
    a := []byte("yak") 

    /* opcode */ _ = uint8(a[0]) 
    /* message */ _ = binary.LittleEndian.Uint16(a[1:3]) 
} 

https://play.golang.org/p/HRu7C5h2a5

Смежные вопросы