2011-08-12 1 views
5

내가 이해 한대로 here "V8에는 세대 별 가비지 수집기가 있습니다. 오브젝트를 무작위로 이동합니다. 노드는 소켓에 쓸 원시 문자열 데이터에 대한 포인터를 가져올 수 없습니다." 그래서 나는 그 문자열이 Math.pow(2,16) 바이트보다 커지면, 문자열에 TCP 스트림에서 오는 데이터를 저장해서는 안된다. (지금까지는 바란다.)NodeJS : TCP 소켓 스트림을 처리하는 적절한 방법은 무엇입니까? 어떤 구분 기호를 사용해야합니까?

TCP 소켓에서 오는 모든 데이터를 처리하는 가장 좋은 방법은 무엇입니까? 지금까지 나는 _:_:_을 구분 기호로 사용하려고 시도 했었습니다. 왜냐하면 나는 그것이 어떻게 든 독특하고 다른 것들을 엉망으로 만들지 않을 것이라고 생각하기 때문입니다. 그것은, 그래서 내가 console.log('MSG' + msg)하려고 할 때마다

net = require('net'); 
var server = net.createServer(function (socket) { 
    socket.on('connect',function() { 
     console.log('someone connected'); 
     buf = new Buffer(Math.pow(2,16)); //new buffer with size 2^16 
     socket.on('data',function(data) { 
      if (data.toString().search('_:_:_') === -1) { // If there's no separator in the data that just arrived... 
       buf.write(data.toString()); // ... write it on the buffer. it's part of another message that will come. 
      } else {  // if there is a separator in the data that arrived 
       parts = data.toString().split('_:_:_'); // the first part is the end of a previous message, the last part is the start of a message to be completed in the future. Parts between separators are independent messages 
       if (parts.length == 2) { 
        msg = buf.toString('utf-8',0,4) + parts[0]; 
        console.log('MSG: '+ msg); 
        buf = (new Buffer(Math.pow(2,16))).write(parts[1]); 
       } else { 
        msg = buf.toString() + parts[0]; 
        for (var i = 1; i <= parts.length -1; i++) { 
         if (i !== parts.length-1) { 
          msg = parts[i]; 
          console.log('MSG: '+msg); 
         } else { 
          buf.write(parts[i]); 
         } 
        } 
       } 
      } 
     }); 
    }); 
}); 

server.listen(9999); 

, 그것은 전체 버퍼를 출력합니다 :

올 것 데이터의 샘플이 내가 할 노력 무엇 something_:_:_maybe a large text_:_:_ maybe tons of lines_:_:_more and more data

것 무언가가 효과가 있는지보기가 무용지물.

어떻게이 데이터를 적절하게 처리 할 수 ​​있습니까? lazy 모듈은 비록이 데이터가 라인 지향적이지 않더라도 작동할까요? 라인 지향이 아닌 스트림을 처리하는 다른 모듈이 있습니까?

+1

당신이 소켓 * 쓰기 * 정보에 대해 이야기하고 연결하는 프리젠 테이션. 당신은 그것을 읽고 있으므로 걱정은 다릅니다. node.js 0.4.6에서 데이터 콜백은 인코딩을 지정하지 않는 한 이미 버퍼를 제공합니다.이 경우 인코딩을 지정하면 문자열을 얻을 수 있습니다. 데이터를 유지 관리하는 방법은 실제 목표가 무엇인지에 따라 다릅니다. –

+0

들어오는 버퍼를 큰 문자열로 저장할 수 있고 성능 문제가 없다는 뜻입니까? –

답변

4

노드가 버퍼를 가져 와서 v8로 밀어 넣기 때문에/문자열을 캐스팅해야한다는 추가 작업이 진행되었다고 할 수 있습니다. 그러나 버퍼에서 toString()을 수행하는 것이 더 나은 것은 아닙니다. 지금 당장은 좋은 해결책이 없습니다. 제가 아는 한 특히 최종 목표가 문자열을 가져다가 바보짓을하는 것이라면 더욱 그렇습니다. Ryan이 @ nodeconf를 작업이 필요한 영역으로 언급 한 것 중 하나입니다.

구분 기호는 원하는대로 선택할 수 있습니다. 많은 바이너리 프로토콜은 고정 된 헤더를 포함하기 때문에 길이가 많은 일반 구조에 물건을 넣을 수 있습니다. 이렇게하면 전체 헤더를 반복하지 않고도 알려진 헤더를 분할하고 나머지 데이터에 대한 정보를 얻을 수 있습니다. 그런 방식으로, 사람과 같은 공구를 사용할 수

, 버퍼가 배열 구를 통해 액세스 할 수있는, .slice()를 사용하여 분리 할 수도 있습니다.

마지막으로 여기를 확인하십시오 : https://github.com/joyent/node/wiki/modules - 간단한 TCP 프로토콜을 구문 분석하고 잘 수행하는 것으로 보이는 모듈을 찾고 코드를 읽습니다.