2013-06-26 5 views
1

누구든지 나를 도울 수 있는지 궁금합니다. 나는 nodejs에 익숙하지 않고 nodejs를 클라이언트로 사용하여 서버에 메시지를 보내려고했다. 서버는 C로 작성되었으며 PHP 설치를보고 pack ('N', len)을 사용하여 문자열의 길이를 서버에 보냅니다. 나는 자바 스크립트에서 비슷한 것을 구현하려고했지만 몇 가지 문제를 겪고있다. 필자는 어디에서 잘못되었는지 (포장 문자열 코드를 복사 한 곳의 phpjs에 대한) 잘못된 점을 지적 할 수 있는지 궁금합니다.nodejs에 unsigned int를 바이너리 문자열로 저장하는 방법은 무엇입니까?

내 클라이언트는 자바 스크립트 코드가 nodejs : 헤더 문자열의 정확한 길이 밖으로

var net = require('net'); 
    var strs = Array("<test1>1</test1>",` 
     "<test_2>A STRING</test_2>", "<test_3>0</test_3>", 
     "<test_4></test_4>", "<test_5></test_5>", 
     "<test_6></test_6>", "<test_7_></test_7>", 
     "<test_8></test_8>", "<test_9>10</test_9>", 
     "<test_10></test_10>", "<test_11></test11>", 
     "<test_12></test_12>", "<test_13></test_13>", 
     "<test_14></test_14>"); 

     hmsg = strs[0] + strs[1] + strs[2] + strs[3] + strs[4] + strs[5] + strs[6]; 
     console.log(hmsg.length); 
     msg = hmsg + "<test_20></test_20>"` 

    msglen = hmsg.length; 
    astr = ''; 
    astr += String.fromCharCode((msglen >>> 24) && 0xFF); 
    astr += String.fromCharCode((msglen >>> 16) && 0xFF); 
    astr += String.fromCharCode((msglen >>> 8) & 0xFF); 
    astr += String.fromCharCode((msglen >>> 0) & 0xFF); 
    var pmsg = astr + msg; 
    console.log(pmsg); 
    var client = net.createConnection({host: 'localhost', port: 1250}); 
    console.log("client connected"); 
    client.write(pmsg); 
    client.end(); 

실행 '노드 TestApp가'인쇄합니다. 서버가 수신하는 것을 보면 머리글 문자열이 < 110 문자 일 때 올바른 길이를 디코딩하지만 머리글 문자열이 110보다 클 경우 (hmsg에 strs [6] 이상을 추가하여) 디코딩 된 길이가 잘못되었습니다. strs [6]를 포함하여 나는 클라이언트쪽에 128 길이의 문자열을 얻었고 서버쪽에는 194 개의 문자열을 얻었다.

분명히 정수를 포장하는 데 문제가 있습니다. 그러나 포장 비트에 익숙하지 않고 잘못된 부분을 잘 모릅니다. 아무도 내 오류가 어디 지적 할 수 있습니까? 많은 감사! 중동 위해 일한 다음 nodejs 메일 링리스트에 표도르 Indutny에

업데이트 감사 :

console.log(hmsg.length, msg.length); 
var msglen = hmsg.length; 
var buf = new Buffer(msg.length+4); 
mslen = buf.writeUInt32BE(msglen, 0); 
mslen = buf.write(msg, 4); 

var client = net.createConnection({host: 'localhost', port: 8190}); 
console.log("client connected"); 
client.write(buf); 
client.end(); 

즉, Buffer의 writeUInt32를 사용하는 것은 헤더 메시지의 길이에 필요한 모든 것입니다. 나는 그것이 다른 누군가를 도울 수 있기를 희망하면서 여기에 올리고있다.

답변

0

나는 당신이 스스로 작업하도록 만들었지 만 훨씬 쉬운 수정을 위해서 당신은 바이너리 모듈을 사용할 수있다. npm install binary

+0

감사와

https://github.com/substack/node-binary

를 설치합니다! 나는 이것을 밖으로 시도 할 것이다. – adil

관련 문제