2012-11-12 5 views
6

작은 핑 스크립트를 만들고 싶습니다. 나는 노드 js의 초보자이다. 나의 궁극적 인 작은 목표는 클라이언트가 서버에 핑 (ping)하도록하는 것입니다. 서버가 콘솔에 메시지를 로깅하여 패킷을 확인하고 클라이언트로 동일한 패킷/메시지를 다시 보내길 원합니다.노드 JS : 핑 서버 및 클라이언트 UDP

이것은 내가 지금까지 무엇을 가지고 :

서버 :

var PORT = 33333; 
var HOST = '127.0.0.1'; 

var dgram = require('dgram'); 
var server = dgram.createSocket('udp4'); 

server.on('listening', function() { 
    var address = server.address(); 
    console.log('UDP Server listening on ' + address.address + ":" + address.port); 
}); 

server.on('message', function (message, remote) { 

    console.log(remote.address + ':' + remote.port +' - ' + message); 
    // I added a server.send but it gave me an infinite loop in the server console 

}); 

server.bind(PORT, HOST); 

클라이언트 :

var PORT = 33333; 
var HOST = '127.0.0.1'; 

var dgram = require('dgram'); 
var message = new Buffer('My KungFu is Good!'); 

var client = dgram.createSocket('udp4'); 

client.on('message', function (message, remote) { 

    console.log("The packet came back"); 

}); 


client.send(message, 0, message.length, PORT, HOST, function(err, bytes) { 
    if (err) throw err; 
    console.log('UDP message sent to ' + HOST +':'+ PORT); 
    count++; 
}); 

UPDATE :

감사합니다! 정말 도움이되었습니다. 하지만 다른 질문이 있습니다. 패킷을 특정 바이트 수로 보내려고한다고 가정 해 봅시다. 1kb의 경우 'message.length'를 1000으로 바꿉니다. 하지만 오류가 발생합니다 ('Offset + 버퍼 길이를 초과하는 길이'); '

나는 이유를 잘 이해하지 못합니다.

답변

9

하나는 데이터를 보내고 다른 것은 수신 중입니다. UDP 프로토콜은 양방향이기 때문에 클라이언트와 서버 간에는 실제 차이가 없습니다. 따라서 서버와 클라이언트 코드는 거의 같을 것입니다. 차이점은 실제로 하나는 패킷을 보내고 다른 하나는 응답 할 것입니다. 또한 아마도 을 PORTHOST 변수와 함께 사용하고 다른 호스트/포트 쌍으로 보내야하기 때문에 무한 루프가 있음에 유의하십시오.

서버

var host = "127.0.0.1", port = 33333; 

var dgram = require("dgram"); 

var server = dgram.createSocket("udp4"); 

server.on("message", function(msg, rinfo) { 
    console.log(rinfo.address + ':' + rinfo.port + ' - ' + msg); 
    server.send(msg, 0, msg.length, rinfo.port, rinfo.address); // added missing bracket 
}); 
server.bind(port, host); 

클라이언트

// NOTE: the port is different 
var host = "127.0.0.1", port = 33334; 

var dgram = require("dgram"); 

var client = dgram.createSocket("udp4"); 

client.on("message", function(msg, rinfo) { 
    console.log("The packet came back"); 
}); 

// client listens on a port as well in order to receive ping 
client.bind(port, host); 

// proper message sending 
// NOTE: the host/port pair points at server 
var message = new Buffer("My KungFu is Good!"); 
client.send(message, 0, message.length, 33333, "127.0.0.1"); 
+0

감사 :

다음은 예입니다! 정말 도움이되었습니다. 하지만 다른 질문이 있습니다. 패킷을 특정 바이트 수로 보내려고한다고 가정 해 봅시다. 1kb의 경우 'message.length'를 1000으로 바꿉니다. 하지만 오류가 발생합니다 ('Offset + 버퍼 길이를 초과하는 길이'); ' 나는 왜 그런지 잘 모른다. –

+0

버퍼의 길이가 18 바이트이기 때문에 ("My KungFu is Good!"길이, 기본 코덱은 문자 당 ascii/2 진수 바이트입니다). 'var message = new Buffer (1000); '로 1000 바이트를 보내라. –