2015-01-12 2 views
1

socket.io를 사용하여 채팅 프로그램을 작동 시키려고하는데 제대로 작동하지 않습니다.이벤트를 Socket.IO에 이벤트를 서버에서 작동하지 않음

Node.js 서버를 사용하고 있는데 제대로 실행되고있는 것으로 보입니다. 나는 이것이 방으로 방출하는 것과 관련이 있다고 생각한다.

내가 클라이언트 브라우저에있는 코드는 다음과 같습니다 페이지가로드, Socket.IO에 때

<script> 

    var socket = io("https://localhost:3000/userChat"); 
    socket.on('connect', function(){ 
    socket.emit('initialiseConnection', "user1"); 
    }); 

    socket.on('messageIn', function(msg){ 
    console.log(msg); 
    $('#messages').append($('<li>').text(msg.message)); 
    }); 

</script> 

그렇게는 서버에 연결하여 "사용자 1"로 서버에 "initialiseConnection"이벤트를 방출한다. 이는 해당 사용자를위한 새로운 방입니다. 서버

는, 내가 "initialiseConnection"를 처리 한 코드는 다음과 같습니다

socket.on("initialiseConnection", function(username){ 
    socket.join(username); 
    console.log(username + " has joined."); 

    Message.find({recipient:username}, function (err, message){ 
     console.log("messages for "+username+": "+message.length); 
     for (var x = 0; x < message.length; x++){ 
     console.log(username+"'s message "+x); 
     console.log(message[x]); 

     socket.to(username).emit("messageIn", {"message":message[x]}); 
     } 
    }); 
}); 

당신이 볼 수있는이 코드는 생성하고 사용자 이름과 동일한 이름을 가진 방을 결합한다. 데이터베이스에서 모든 메시지를 검색하여 해당 메시지를 사용자에게 보내려고합니다. 나는 메시지를 기록한다. 분명히 메시지가 있고 "socket.to()"메소드의 사용자 이름도 올바르게 로그에 표시됩니다. 하지만 클라이언트 브라우저의 "socket.on ('messageIn')"은 이벤트를 선택하지 않는 것 같습니다. 이것은

을 완료하는 데 필요한 몇 가지 backbround 처리에 관련이 경우에 내가있을 수 있습니다 어디

사람이 볼 수

setTimeout(function() { 
    socket.to(username).emit("messageIn", {"message":"test message"}); 
}, 5000); 

을 즉시 socket.join() 후 :

는 또한 퍼팅 시도 이것에 잘못 갔어?

감사합니다.

--edit 1 --------------------------------------

var https = require('https'); 
var express = require('express'); 
var app = express(); 
var server = https.createServer(https_options, app).listen(3000); 
var io = require('socket.io')(server); 

var userChat = io.of("/userChat"); 
userChat.on('connection', function(socket){ 
    console.log('a user connected'); 

    socket.on("initialiseConnection", function(username){ 
    ... 
    }); 

    socket.on('disconnect', function(){ 
    socket.leave(socket.room); 
    }); 
}); 
+0

연결 이벤트를 수신 한 다음 각 수신 소켓에 이벤트 처리기를 바인딩하는 서버 측 코드의 다른 부분은 어디에 있습니까? 당신이 그것을 포함하지 않았기 때문에 그것이 문제가되는 곳인지 궁금합니다. – jfriend00

+0

EDIT 1에 줄이기 버전을 추가했습니다. 더 필요한 경우 알려주세요. 비록 그것이 한 방향으로 연결할 수 있다면 나는 가질 수 있지만. 반대 방향으로도 통신이 가능합니다. – X0r0N

답변

0

는이 작업을 변경해야

socket.to(username).emit("messageIn", {"message":message[x]}); 

이에 :

socket.emit("messageIn", {"message":message[x]}); 

소켓 엔드 포인트입니다. 보내면 소켓으로 직접 보내면됩니다. 방에있는 사용자에게 보내지 않습니까? 방금 소켓에 보냅니다. socket 변수에 이미 소켓이 있으므로 그 주소를 보내십시오.

+0

감사합니다 이것이 해결책 인 것 같습니다. 나는 이벤트를 내기 위해 방에 있어야하지만 – X0r0N

+0

@ X0r0N - 방은 그룹이 모든 사람 (또는 원래 보낸 사람을 제외한 모든 사람)에게 동일한 메시지를 보내는 것을 지원할 수있는 소켓 그룹입니다. 내부적으로, 엔진은 항상 주어진 소켓에 주어진 메시지를 보낸다. 따라서, 어떤 사용자에게 보내고 싶은지 안다면, 그 사용자의 소켓으로 보내면됩니다. – jfriend00

관련 문제