2013-11-07 2 views
0

Я получаю много данных на моей стороне сокета socket.io, которые могут быть или не быть полными данными, а также потенциально большими данными, поэтому мне нужно сделать это эффективным , Поэтому я попробовал свои силы при создании буфера и разбора этого приложения. Я знаю, что есть доступные потоковые/буферизирующие модули, и я мог бы подумать об их использовании, если они достигнут цели быть более эффективными. Ждем ваших ответов и возможных аргументов о том, как это сделать.Могу ли я сделать это более эффективным? Создание буфера в Javascript с помощью NodeJS, Socket.io

Обратите внимание, что пропускная способность не является моей проблемой, насколько быстро клиентский Javascript может отображать данные в удобном для браузера формате.

Вот что у меня есть.

function extended_split(str, separator, max) { 
     var out = [], 
       index = 0, 
       next; 

     while (!max || out.length < max - 1) { 
       next = str.indexOf(separator, index); 
       if (next === -1) { 
         break; 
       } 
       out.push(str.substring(index, next)); 
       index = next + separator.length; 
     } 
     out.push(str.substring(index)); 
     return out; 
}; 

var buffer = ''; 

// data format "\nOP:ARGS:DATA(could be base64 or 'other' depending on OP)\0"; 
socket.on('ioSend', function(data) { 
    data = String.fromCharCode.apply(null, new Uint16Array(data)); 
    buffer = buffer + data; 
    while(buffer.indexOf('\n') != -1 && extended_split(buffer, '\n', 2)[1].indexOf('\0') != -1) 
    { 
     splitted = extended_split(extended_split(buffer, '\n', 2)[1], '\0', 2); 
     parse = splitted[0]; 
     buffer = splitted[1]; 
     parse = parse.split(':'); 
     // Do stuff with parse here      
    } 
}); 
+0

Скорость обработки данных на стороне клиента даст вам разные результаты, потому что она выполняется на разных машинах, но в среднем ее не заметно, я имею в виду текст, если ваш текст не в MB, тогда вам не стоит беспокоиться о Это. – Gntem

ответ

0

Я взял еще одну трещину и отбросил расширенную идею разделения и придумал это.

socket.on('ioSend', function(data) {         // receive command from socket.io 
    if (safeBrowser) {             // IE < 10 doesn't support Uint16Array 
     var xdata = new Uint16Array(data); 
     data = String.fromCharCode.apply(null, xdata); 
     buffer = buffer + data;           // Update the buffer with most recent ioSend data 
    } 
    else {                // So we have to kludge this in for IE < 10 
     var xdata = ''; 
     for (var i = 0; i < data.length; i++) { 
      xdata += String.fromCharCode(data[i]); 
     } 
     buffer = buffer + xdata;           // Update the buffer with most recent ioSend data 
    } 
    var splitA = []; 
    var splitB = []; 
    while(buffer.indexOf(d1) != -1 && buffer.indexOf(d2) != -1)   // While loop reads buffer until there are no commands left to issue 
    { 
     splitA = buffer.split(d2);     // Array with rear delimiter 
     splitB = splitA[0].split(d1);   
     doParse.call(null, splitB[1]);    // This should be an @command 
     splitB = null; 
     splitA.shift();        // Shift array 
     buffer = splitA.join(d2);     // Update buffer from shifted array with rear delimiter 
    }  
}); 

Это действительно быстро во всех модульных тестах и ​​делает работу действительно хорошо. Я работаю над реализацией, которая не использует socket.io, поскольку предлагается @GeoPhoenix, но до тех пор это работает хорошо.

1

Подвижной свой собственный буфер строитель/парсер его нормально, но вы можете потратили вдвое больше времени, работая и поддерживая его, от просто получить производственную готовый сценарий.

Теперь с моей точки зрения, я бы первое падением socket.io для вашего дела, так как it just doesn't transmit binary as it should, есть и другие модули, которые передают двоичным https://github.com/binaryjs/binaryjs, которые лучше подходят для двоичных передач по протоколу WebSocket.

я также хотел бы попробовать http://bsonspec.org/(проверка реализации для узла модулей), который кодирует ваши JSON в двоичный, таким образом, вы могли пропустить всю проблему с созданием и поддержанием буфера парсера/строителя.

+0

Часть данных более чем вероятно будет base64, а не бинарной, но может также быть «другой» (я должен был уточнить), пропускная способность не является проблемой, как пропускная способность. Мне в основном нужно получить все, что может сойти с этой трубки, и как можно быстрее превратить ее в дружественные браузеру данные. Спасибо за ссылки на модуль, я обязательно посмотрю. На данный момент socket.io является неотъемлемой частью моего приложения не только для этой части, но, безусловно, стоит посмотреть на альтернативы. – tremor

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