2016-06-09 9 views
0

일부 사람들은 이미 다른 곳에서이 질문을했으며, 여기에 존재하는지 확실하지 않습니다. 어쨌든, Primus.ioengine.io과 함께 사용하는 변압기입니다. 브라우저 (클라이언트)에서 websocket 연결을 공유 할 수 있는지 궁금합니다. 하나의 클라이언트를 연결하고 다른 탭에 다른 클라이언트를 연결하는 경우처럼. 이상적으로 그들은 동일한 연결을 가져야합니다. 소켓을 통해 무언가를 보내면 두 탭 모두 메시지를 가져올 수 있어야합니다.브라우저 탭간에 소켓 연결을 공유하는 방법이 있습니까

다른 사람들은 localStorage을 다른 탭에서 같은 데이터를 공유/전달하는 방법에 대해 언급했지만, 나는 그걸 깔끔하게 찾지 못했습니다.

귀하의 도움에 감사드립니다. 당신의 두 개의 탭에

최저

,

+0

그게 소켓 작동 방식인가요? 동일한 서버에 연결된 두 개의 탭이있는 경우 두 가지 모두 메시지에 대한 알림을 받게됩니다. –

+0

각 탭에는 서버에 별도의 연결 및 소켓 ID가 있습니다. 따라서 특정 세션이나 사용자의 모든 소켓에 메시지를 보내려면 해당 사용자를 여러 소켓으로 다시 매핑해야합니다. – Matt

답변

0

코드의 경우는 다른 탭을 하나 개의 탭에서 웹 소켓 연결에서 데이터를 공유 할 수 있으며, 협력한다. 탭이 열리면 다른 탭이 이미 기존의 webSocket 연결로 열렸는지 확인해야합니다. 그런 다음 해당 탭에서 데이터를 새 탭과 공유하도록 요청해야합니다. 사용자가 열지 않은 이전 창 스크립트로 새 창을 연 경우가 아니면 브라우저 창에 다른 브라우저 창을 쉽게 찾을 수있는 방법이 없으므로 사소한 작업은 아닙니다.

그러나 각 Windows가 서버에 대한 webSocket 연결을 시도하는 경우에는 각각 자신의 webSocket 연결을 갖게됩니다. 탭 사이에 webSocket 연결을 자동으로 공유하지 않습니다.

FYI의 일반적인 동작은 각 창에서 서버에 대한 자체 webSocket 연결을 얻은 다음 서버가 각 브라우저 창과 별도로 통신한다는 것입니다. 한 창에서 가져온 정보 중 일부 정보를 다른 창과 동기화해야하는 경우 서버를 코딩하여 최신 상태로 유지할 수 있습니다.

1

각 탭에는 서버에 대한 별도의 연결이 있으며 고유 한 소켓 ID가 있습니다.

사용자 ID 또는 세션 ID에 대한 모든 소켓에 메시지를 내보내려면 사용자 또는 세션을 다중 소켓 연결로 매핑해야합니다.

Socket.IO에서 그들은 "room"의 개념을 가지고 있습니다.

connectionroom에 소켓을 추가 할 수 있습니다. 이 예에서는 그룹화에 대해 passport.js 사용자 이름을 사용합니다.

io.on('connection', function(socket){ 
    socket.join(socket.request.user.username); 
}); 

그러면 해당 방의 모든 소켓으로 메시지를 보낼 수 있습니다.

io.to(username).emit('some event'): 

Socket.IO가 disconnect의 방을 청소합니다.

https://github.com/cayasso/engine.io-rooms은 유용 할 수도있는 engine.io의 실 구현입니다.

  • 연결에 간단한 측면에서

    , 당신은 사용자에 대한 소켓의 목록에 새 소켓을 추가 할.

  • 연결이 끊어지면 사용자의 소켓 목록에서 소켓을 삭제하려고합니다.
  • 방출시 사용자의 목록에있는 모든 소켓에 메시지를 보내려합니다.