Как я могу обмениваться двоичными данными между сервером WebSocket Node.js и клиентом C#?

У меня есть сервер Node.js WebSocket и клиент Unity с активом Best HTTP. Я имел обыкновение передавать данные JSON, но парсинг стоил слишком много ресурсов процессора. Теперь я пытаюсь отправить сообщение byte[] из C# следующим образом:

//sending sample array - new float[] { 1.32, 3.12 }
//convert an object to a byte array
private byte[] ObjectToByteArray(Object obj)
{
    if(obj == null)
       return null;

    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    bf.Serialize(ms, obj);

    return ms.ToArray(); 
}

Но сервер получил Uint8Array [1, 3] и дробная часть потеряна.

var wss = new WebSocket.Server({ port: 8080 });
wss.binaryType = "arraybuffer";
wss.on('connection', function connection(ws) {
    ws.on('message', function (message) {
    });
});

Основной вопрос: как правильно анализировать массивы (особенно вложенные) в двоичном формате и кодировать в массив после?

2 ответа

Обычная двоичная сериализация может стать узким местом для веб-API. Если ваши объекты хорошо определены и могут быть смоделированы в классы, я рекомендую вам использовать Protobuf.

Самое замечательное то, что он кроссплатформенный, и вы можете использовать одно и то же определение как для своего сервера NodeJS, так и для клиента C#.

Вы можете попробовать бинарный json BSON http://bsonspec.org/implementations.html

или MSGPACK http://msgpack.org/index.html

обе библиотеки предлагают реализацию на разных языках и хорошо протестированы.

Другие вопросы по тегам