* 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); |