2012-11-07 5 views
3

나는 자바 클라이언트 이미지를 전송하는 간단한 NodeJS의 TCP 서버를 만들어 모든 데이터를 보내고 즉시 플러시하면 출력은 다음과 같습니다.NodeJS TCP 서버,으로 onData 작은 덩어리

TCP Recieved: 13 
TCP Recieved: 1344 
TCP Recieved: 1344 
TCP Recieved: 1344 
TCP Recieved: 1344 
TCP Recieved: 1344 
TCP Recieved: 1472 
TCP Recieved: 1344 
TCP Recieved: 1344 
TCP Recieved: 1344 
TCP Recieved: 1344 

간단한 청크로 수신하고 싶습니다. NodeJS의 이벤트 핸들링 메카니즘으로 인해 일어난다 고 가정합니다. 단일 청크로 전송 된 데이터에 대해 단일 청크를 얻는 가장 좋은 방법은 무엇입니까? 내가 아는 한 TCP 창은 1344 바이트보다 훨씬 클 수 있습니다. 헤더 값을 HTTP로 사용하여 원하는 길이의 광고를 만들 수 있다고 생각했습니다.

+0

이 방식의 TCP 작품이다. 노드뿐만 아니라 모든 곳에 있습니다. 당신은 이것을 통제 할 수 없습니다. 그리고 너는 시도하면 안된다. tcp 서버를 작성할 때 항상 임의의 크기의 청크가 들어오는 데이터라고 가정합니다. –

+0

예, TCP가 스트리밍 프로토콜이라는 것을 알고 있지만 특정 양의 데이터가 수신 될 때 이벤트를 트리거하는 방법이 있는지 알고 싶습니다. java 소켓 읽기와 같은 것이지만 버퍼링 메커니즘을 만들어야합니다. – Mustafa

답변

7

노드에서 데이터가 청크로 표시됩니다. 버퍼를 유지하고 들어오는 모든 블록을 연결 한 다음 소켓이 닫히면 데이터를 파일 시스템에 기록해야합니다. 다음은 이미지를 수신 할 수 있었던 예는 다음과 같습니다

net = require('net'); 
fs = require('fs'); 

net.createServer(function(socket){ 
    var buffer = new Buffer(0, 'binary'); 

    socket.on("data", function(data){ 
    buffer = Buffer.concat([buffer, new Buffer(data,'binary')]); 
    }); 

    socket.on("end", function(data) { 
    fs.writeFile("image.jpg", buffer, function(err) { 
     if(err) { 
     console.log(err); 
     } else { 
     console.log("Socket[" + socket.name + "] closed, wrote data out to sinfo.data"); 
     } 
    }); 

    }); 

}).listen(5000); 

console.log('ready'); 

가 나는 netcat를 사용하여 이미지를 전송 :

$ netcat localhost 5000 < input.jpg 
+4

이유 당신은 그 (것)들을 받기 때문에 당신은 다만 디스크에 덩어리를 쓰지 않을 는가 것입니다? 전체 이미지를 메모리에 버퍼링 한 다음 디스크에 쓰는 것은 낭비입니다. – josh3736

+1

@ josh3736 : 귀하의 의견은 제가 시도한 것입니다. 클라이언트에서 서버로 base64로 인코딩 된 소켓 스트림을 보냅니다. 서버는 들어오는 청크에서 이미지 파일을 작성해야합니다. RAM을 절약하기 위해이 청크를 쓰기 스트림에 제대로 기록하는 방법을 알고 있습니까? 이것은 내 질문입니다 : stackoverflow.com/questions/22214267/write-base64-chunks-into-writestream – Flexer

+1

내가 뭔가를 놓친 건가요? 그냥 파이프를 사용할 수 없습니까? socket.pipe (fs.createWriteStream (filePath)); – CharlesTWall3