2016-09-27 4 views
0

노드 j에서 방금 작업을 시작했습니다. 노드 js를 사용하여 채팅 응용 프로그램을 만들려고했습니다. 단일 사용자가 여러 장치 또는 브라우저를 통해 로그인 할 수 있습니다. 내가 잘못 아니었고 각 브라우저가 IP 주소와 포트 주소에 의해 소켓 연결이 정의 된 이후에 서로 다른 포트 주소로 통신한다는 것을 이해할 수 있습니다. 따라서 동일한 사용자가 두 개의 다른 브라우저에서 로그인 할 때 서버는 두 개의 다른 소켓 ID를 만듭니다. 만약 사용자가 이미 소켓 정보를 보내는 매개 변수를 확인하여 연결되어 있다면. 사용자가 이미 연결되어 있거나 소켓이 이미 사용자에 대해 설정되어 있으면 소켓 ID를 이전 소켓 ID로 변경하기위한 연결을 만듭니다. 다른 클라이언트가 다음 현재 사용자에게 메시지를 방출 할 때 k는노드 js 소켓 연결

이제 이전에 연결된 동일한 사용자의 소켓 ID입니다

io.on('connection', function(socket){ 
socket.id = k; 
}); 

소켓 ID가 교체되고 하나의 브라우저는 메시지 또는 둘을 얻는다 메시지를받습니다. 서버 연결이 브라우저 또는 단일 브라우저 모두에 설정되어 있는지 확인하십시오. 제발 도와주세요. 소켓 연결이 클라이언트와 서버간에 어떻게 설정되는지 아직 명확하지 않습니다. 내가 잘못 생각한 부분을 개선하십시오. 또는 다음의 scenerio를 어떻게 해결해야합니까? 미리 감사드립니다.

답변

2

내가 올바르게 문제를 이해하면 제 방식으로 설명 드리겠습니다. 상응하는 클라이언트가 될 것

var io = require('socket.io')(somePort); //same port for the client to connect, e.g. 3000 
    io.on('connection', function(socket){ 
    // in here you should define any actions on your primary socket 
    // for example: 
     socket.on("hello", function(dataUserSendsWithTopicHello){// overly long variable name to show my point! :) 
     // do something with hello data 
     }); 

    // this will go to anyone who is connected and has a handler like above for "hello" 
     socket.emit("hello", "hello to all who listen to hello topic"); 
    }); 

:

var socket = io.connect('ip:port'); // e.g. localhost:3000 - same ip and port as above 

    socket.on('hello', function(serverResponseToHello){ 
    // do something when server sends back something on hello 
    }); 

// send a hello to the server 
    socket.emit("hello", "Sending hello to server"); 

을 이제 만 사용자에게 회신 할 경우, 또는 그룹의 서버에 대한 다음과 같은 코드가 있다고 가정하자 사람들이 채팅 할 때처럼 모든 메시지를 함께 볼 수있게하려면 socket.io의 방/네임 스페이스 구현 (http://socket.io/docs/rooms-and-namespaces/)을 활용하고 각 클라이언트에 대해 하나의 공간을 만들거나 클라이언트 그룹에 대해 하나의 공간을 만들 수 있습니다. 이를 위해이 대답을 살펴보십시오. Using Socket.io with multiple clients connecting to same server

요약하면 1 개의 ip와 1 개의 포트가 있습니다. 모든 사람이이 IP 및 포트를 수신하며 세 개의 탭을 열고 위와 같은 구현을하면 모든 탭에서 "hello"를 듣게됩니다. 대화방을 사용하면 사용자를 그룹화하고 통신을 분리하여 올바른 사용자간에 통신이 이루어지는 사용자 만 사용할 수 있습니다.

행운을 빈다.

+0

제 질문은 다른 브라우저 또는 컴퓨터에 대한 것입니다. 사용자가 여러 컴퓨터에서 로그인하거나 다른 브라우저 일 수 있습니다. –

+0

다른 브라우저 또는 다른 컴퓨터 (룸/네임 스페이스 구현이없는 경우)는 탭이 여러 개있는 것과 같습니다. 소켓은'someIp : somePort'라고 말할 수 있습니다. '98.45.32.21 : 3000'은 변경되지 않으므로, "hello"를 보내면 서버가 hello (위의 구현에서)와 함께 모든 사람에게 응답합니다. – mkaran

+0

사용자가 두 개의 다른 브라우저에서 로그인하여 동일한 메시지 - 그의 메시지 만 볼 수있게하려는 경우 해당 사용자를 올바른 회의실과 연관시켜야하므로 두 번째 브라우저에서 연결하고 사용자임을 알 수 있습니다 'sagar', 당신은 그를 올바른 방에 합류시킬 것입니다. – mkaran

0

저는 소켓 (및 JS)에 너무 익숙하지 않으며, 채팅 앱도 조금씩 다르게 만들려고합니다.

나는 메시지가 하나의 브라우저에서만 수신된다는 것을 이해합니다. 더 나은 디자인은 사용자가 여러 브라우저/장치를 통해 연결할 수있게하는 것입니다. 사용자가 연결된 모든 소켓 목록을 유지 관리 할 수 ​​있습니다 (필요한 경우).

일대일 채팅이 필요한 경우 두 명의 사용자가 연결되는 모든 소켓이 하나의 회의실로 연결되는 코드를 작성할 수 있습니다.

socket.room = roomname 
socket.join(roomname) 

그 방으로 메시지를 브로드 캐스트합니다. 그렇게하면 두 사용자가 연결된 모든 소켓이 메시지를 받게됩니다.

socket.to(socket.room).broadcast.emit("message", message); 

이 도움이

희망 (I 소켓이 객실의 정보를 저장하고, 아무 생각하는 좋은 디자인이없는 경우)!