2017-04-25 13 views
0

저는 Nodejs와 Socket.io를 처음 사용합니다. 이것은 채팅 응용 프로그램을 만들 때 처음이기 때문에 바보 같은 질문을하는 경우 용서해주십시오.Nodejs 소켓 io 서버 - 클라이언트를 여러 개 만드는 방법은 무엇입니까?

내 웹에서 나는 종류의 채팅 서비스가 있어야합니다. 하나는 대화방의 종류이며 다른 하나는 Facebook Messenger와 같은 개인 메시징입니다.

나는 대화 ID를 확인하는 메시지를 표시하기 전에 개인 메신저로 모두 만들었으므로 매우 적절하게 작동합니다. 라이브 토론 또한 적절하게 작동합니다.

하지만 문제가 있습니다. 라이브 메신저에서 보낸 모든 메시지는 실시간 토론 창에도 표시됩니다. 그래서 메신저에 대한 Server.js 파일을 변경하고 수신 포트를 변경했습니다. 이제 라이브 토론의 수신 포트는 3000이고 메신저는 8050이지만 여전히 메신저 메시지를 수신하는 라이브 토론입니다.

내가 잘못하고 있나? 두 가지 채팅 응용 프로그램을 실행할 수있는 다른 방법이 있습니까?

나는 네임 스페이스를 server.js

var nsp = io.of('/debate') 
nsp.on('connection', function (socket) { 

    console.log("client connected"+socket.id); 
    var redisClient = redis.createClient(); 
    redisClient.subscribe('message'); 
    var redisClient1 = redis.createClient(); 
    redisClient1.subscribe('debate'); 

    redisClient.on("message", function(channel, data) { 
    console.log("mew message add in queue "+ data+ " channel"); 
    nsp.emit(channel, data); 

    }); 

    socket.on('disconnect', function() { 
    redisClient.quit(); 
    }); 

}); 

클라이언트 코드

var socket = io.connect('http://localhost:3000/debate'); 
socket.on('message', function (data) { 
    data = jQuery.parseJSON(data); 
    console.log(data.user); 
    $("#messages").append("<strong>"+data.user+":</strong><p>"+data.message+"</p>"); 
    $('#messages').animate({ 
    scrollTop: $('#messages').get(0).scrollHeight}, 200); 
}); 

답변

1

socket.io 다른 네임 스페이스의 사용을 지원을 사용하여이 서버 코드

var app = require('express')(); 
var server = require('http').Server(app); 
var io = require('socket.io')(server); 
var redis = require('redis'); 

server.listen(3000); 
io.on('connection', function (socket) { 

    console.log("client connected"); 
    var redisClient = redis.createClient(); 
    redisClient.subscribe('message'); 

    redisClient.on("message", function(channel, data) { 
    console.log("mew message add in queue "+ data+ " channel"); 
    socket.emit(channel, data); 
    }); 

    socket.on('disconnect', function() { 
    redisClient.quit(); 
    }); 

}); 

을 사용하고 있습니다. 두 개의 개별 서버를 만드는 대신 해당 기능을 사용해야합니다. 그 후 특정 네임 스페이스에 socket.emit을 사용할 수 있습니다. 자세한 내용은 다음 문서를 참조하십시오. https://socket.io/docs/rooms-and-namespaces/

+0

이것은 내가 원하는 것이지만, namesapce를 사용하면 내 클라이언트가 연결되지 않습니다. 나는 또한 socket.to (socket.id) .emit (channel, data);를 사용했다. 이 클라이언트는 클라이언트에 연결되지만 데이터는 방출되지 않습니다. 이름 공간 코드로 질문을 편집했습니다. 한번 봐주세요. – vinita

0

nodejs를 시작할 때 모든 사람이 생각하는 것처럼 채팅 앱을 작성하는 것은 그리 어렵지 않지만 nodeJS는 사용하기 쉬운 방이 있습니다.

io.on('connection', function(client){ 

    client.on('room_connection', function(id){ 
     client.join(id); // User joins room. 
    }) 

    client.on('message', function(data){ 
     io.to(data.room).emit('message', {message:data.message, client:client.conn.id}); 
    }); 
}) 

이것은 거의 필요한 것입니다. 이것은 PM의 경우 작동하는데, 단순히 여러 사용자가이 대화방에 참여하는 것을 허용하지 않으며, 여러 사용자가 참여할 수있는 일반적인 대화방을 허용하지 않기 때문입니다.