2012-05-07 3 views
3

Проблема в том, что отправка большого сериализованного JSON (более 16 000 символов) по сетевому сокету делится на куски. Каждый кусок запускает событие data на принимающей стороне. Поэтому просто запуск JSON.parse() по входящим данным может завершиться с ошибкой SyntaxError: Unexpected end of input.узел - отправить большой JSON поверх сетевого сокета

Работа, с которой мне удалось дойти, заключается в том, чтобы добавить нулевой символ ('\u0000') в конец сериализованного JSON и проверить его на принимающей стороне. Вот пример:

var partialData = ''; 
client.on('data', function(data) { 
    data = data.toString(); 
    if (data.charCodeAt(data.length - 1) !== 0) { 
     partialData += data; 
     // if data is incomplete then no need to proceed 
     return; 
    } else { 
     // append all but the null character to the existing partial data 
     partialData += data.substr(0, data.length - 1); 
    } 
    // pass parsed data to some function for processing 
    workWithData(JSON.parse(partialData)); 
    // reset partialData for next data transfer 
    partialData = ''; 
}); 

Одной из неудач этой модели, если приемник подключен к нескольким разъемам, и каждый сокет отправки больших файлов в формате JSON.

Причина, по которой я делаю это, заключается в том, что мне нужно передавать данные между двумя процессами, запущенными в одном окне, и я предпочитаю не использовать порт. Следовательно, используя сетевой сокет. Таким образом, было бы два вопроса: во-первых, есть ли лучший способ быстро передать большие данные JSON между двумя процессами Node.js? Во-вторых, если это лучший способ, то как мне лучше обработать случай, когда сериализованный JSON разбивается на куски при отправке?

+0

Любопытный..Что вы хотели бы сделать это через соединение сокетов против HTTP? –

+0

, имеющий один файловый вещатель сокета. Я могу создать много «слушателей», которые захватывают данные, а затем заполняют их (например, отправьте его в базу данных, график в браузере и т. Д.). хотя я открыт для любого метода более надежной отправки данных от одного до многих процессов Node.js. –

ответ

4
  1. Вы можете использовать try ... catch каждый раз, чтобы узнать, является ли он действительным json. Не очень хорошая производительность.
  2. Вы можете рассчитать размер вашего json на стороне отправки и отправить его до JSON.
  3. Вы можете добавить граничную строку, которая вряд ли будет в JSON. Ваш \ u0000 - да, это кажется законным способом. Но самым популярным выбором является новая линия.

  4. Вы можете использовать внешние библиотеки, такие как dnode, которые уже должны делать то, о чем я упоминал ранее. Я бы рекомендовал попробовать это. В самом деле.

Одной из неудач этой модели, если приемник подключен к нескольким разъемам, и каждый сокет отправки больших файлов в формате JSON.

Используйте различные буферы для каждого сокета. Здесь нет проблем.

+0

спасибо за ответ. никогда не слышал о dnode. –

1

Можно идентифицировать каждый разъем отдельно и создавать буферы для каждого из них. Я добавляю идентификатор для каждого сокета, когда получаю соединение, а затем, когда я получаю данные, я добавляю эти данные в буфер.

net.createServer(function(socket) { 
    // There are many ways to assign an id, this is just an example. 
    socket.id = Math.random() * 1000; 
    socket.on('data', function(data) { 
    // 'this' refers to the socket calling this callback. 
    buffers[this.id] += data; 
    }); 
}); 

Каждый раз, когда вы можете проверить, если вы получили, что «ключ» разделитель, который сообщит вам, что буфер готов к использованию.

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