The Pursuit of Happyness

실행환경 Ubuntu 14.04 LTS / node v0.10.25


이번에는 events 모듈을 이용한 채팅서버 코드이다.

events 모듈을 이용하여 원하는 명령어에 대한 동작을 다음과 같이 구현하면 된다.

event를 전송하는 channel 객체를 생성하고, 채널 객체에 clients 에는 소켓들을, subscriptions 에는 각 클라이언트에 전달하는 메써드를 지정한다.

클라이언트 연결시에는 'join' 이벤트가, 연결 종료시에는 'leave' 이벤트가 처리된다.


var events = require('events');
var net = require('net');

var channel = new events.EventEmitter();
channel.clients = {};
channel.subscriptions = {};

channel.on('join',
        function(id, client) {
                this.clients[id] = client;
                this.subscriptions[id] = function(senderId, message) {
                        if (id != senderId) {
                                this.clients[id].write(message);
                        }
                }
                this.on('broadcast', this.subscriptions[id]);
        }
);

channel.on('leave',
        function(id) {
                channel.removeListener('broadcast', this.subscriptions[id]);
                channel.emit('broadcast', id, id + " has left the chat.\n");
        }
);

var server = net.createServer(
        function(client) {
                var id = client.remoteAddress + ':' + client.remotePort;
                channel.emit('join', id, client);
                client.on('data',
                        function(data) {
                                channel.emit('broadcast', id, data.toString());
                        }
                );
                client.on('close',
                        function() {
                                channel.emit('leave', id);
                        }
                );
        }
);
server.listen(3000);


Comment +0

실행환경 Ubuntu 14.04 LTS / node v0.10.25


다음은 node.js 로 작성한 채팅 서버 코드.

chat.js라는 파일에 다음과 같이 코드를 작성해서 저장.

var net = require('net');
var sockets = [];

var server = net.createServer(
                function(socket) {
                        socket.name = socket.remoteAddress + ":" + socket.remotePort;
                        sockets.push(socket);
                        socket.write("Welcome " + socket.name + "\n");
                        broadcast(socket.name + " joined the chat\n", socket);

                        socket.on('data',
                                function(data) {
                                        broadcast(socket.name + "> " + data, socket);
                                }
                        );

                        socket.on('end',
                                function(data) {
                                        sockets.splice(sockets.indexOf(socket), 1);
                                        broadcast(socket.name + " left the chat.\n");
                                }
                        );
                }
);

function broadcast(message, sender) {
        sockets.forEach(
                function (socket) {
                        if (socket === sender) return;
                        socket.write(message);
                }
        );
}
server.listen(3000);

실행은 nodejs chat 이라고 입력하면 된다.

코드를 살펴보면, 이 채팅 서버는 3000번 포트로 작동한다.

클라이언트에서 접속하면 소켓 IP와 Port를 아이디로 할당하여 sockets 에 저장.

그리고 새로 접속한 클라이언트에게는 서버 Welcome 메시지를 전송하고, 기존의 클라이언트에게는 새로운 유저가 들어왔다는 메시지를 broadcast로  전송.

클라이언트가 끊고 나가는 경우 sockets에서 해당 소켓 정보를 삭제하고 남은 클라이언트 들에게 유저가 나갔다는 메시지를 전달.

 

테스트를 위해서 telnet 을 이용해서 접속을 한다.

telnet [서버IP] 3000

 

텔넷 창을 여러개 띄워서 상대방이 보낸 메시지가 제대로 오는지 확인한다.

Comment +0