반응형

* TCP Server는 net module로 생성할 수 있으며 다음의 이벤트를 발생 시킬 수 있다.

var server=require('net').createServer();

var port=4001;

server.on('listening',function(){

        console.log('Server is listening on port',port);

});

server.on('connection',function(socket){

        console.log('Server has a new connection');

        socket.end();

        server.close();

});

server.on('close',function(){

        console.log('Server is now closed');

});

server.on('error',function(){

        console.log('Error occured:',err.message);

});

server.listen(port);


* createServer는 다음과 같이 connection 이벤트 함수를 등록 가능하다.

 require('net').createServer(function(socket){

// connection 이벤트 발생시 진입하는 함수

socket.on('data',function(data){

//데이터가 전송될 경우 진입

});

socket.on('end',function(data){

//connection 이 종료되었을 경우 진입

});

socket.write('Data.'); //데이터 전송

}).listen(서버포트);


* Socket객체 이용

 - socket 은 stream 임, 다시 말해 data와 end event를 가진다. 다음은 단순한 echo 서버이다.

 var server=require('net').createServer(function(socket){

        console.log('new connection');

        socket.setEncoding('utf8');

        socket.write("Type 'quit' to exit.\n");

        socket.on('data',function(data){

                console.log('got:',data.toString())

                if(data.trim().toLowerCase()==='quit'){

                        socket.write('Byt');

                        return socket.end();

                }

                socket.write(data);

        });

        socket.on('end',function(){

                console.log('Client connection ended');

        });

}).listen(4001);

 - socket 은 stream이기 때문에 pipe를 이용 가능하다

 var ws=require('fs').createWriteStream('socketstream.txt');

require('net').createServer(function(socket){

        socket.pipe(ws);

}).listen(4001);


 require('net').createServer(function(socket){

        var rs=require('fs').createReadStream('socketstream.txt');

        rs.pipe(socket);

}).listen(4001);

 pipe는 기본적으로 read stream이 종료되면 write stream도 종료된다. read stream이 종료되도 write stream(즉 socket)이 종료되지 않게 하기 위해서는 pipe에 {end:false} 를 option을 주면 된다.


* idle socket은 setTimeout(milliseconds) 로 traffic 이 없을 경우 connection을 종료할 수 있다.

 var timeout=6000;

socket.setTimeout(timeout);

socket.on('timeout',function(){

socket.write('idle timeout..');

socket.end();

});

또는 다음과 같이 줄일 수 있다.

 socket.setTimeout(6000,function(){

socket.end('idle time, disconnecting..');

});


* keep-alive 설정

 - ACK flag를 가진 빈 TCP Packet을 보내서 connection을 유지할 수 있다.

 socket.setKeepAlive(true);

 - packet을 보내는 주기를 지정 가능하다

 socket.setKeepAlive(true,10000);


* TCP Buffer의 전송 Delay 설정

 - socket.setNoDelay(true); 로 write시 데이터를 즉시 보내게 할 수 있다. (socket.setNoDelay(false); 로 해제)


* listening client connections

var port=4001;

var host='127.0.0.1';

server.listen(port,host);

 - host가 생략되면 모든 IP Address에서 들어온 connection을 받아들인다.


* closing server

 server.close()

 server.on('close',function(){

console.log('server closed');

});


* 다음은 간단한 TCP Chat Server 예제이다.

var net=require('net');

var server=net.createServer();

var sockets = [];

server.on('connection',function(socket){

        console.log('New connection');

        sockets.push(socket);

        socket.on('data',function(data){

                console.log('got data:',data);

                sockets.forEach(function(otherSocket){

                        if(otherSocket!==socket){

                                otherSocket.write(data);

                        }

                });

        });

});

server.on('error',function(err){

        console.log('Server Error:',err.message);

});

server.on('close',function(){

        console.log('Server closed');

        var index=sockets.indexOf(socket);

        sockets.splice(index,1);

});

server.listen(4001);


반응형

+ Recent posts