2014-09-12 2 views
5

나는 노드 socket.io 서버와 각도 기반 socket.io 클라이언트 (angular-socket.io 사용)로 작업하고 있으며, 다음과 같은 특정 조건을 제외하고는 잘 작동한다. 완전히 어떻게 할 수 없는가? 소켓을 연결할 수 없을 때 완료되면 소켓을 파괴하십시오.AngularJS : socket.io destroy socket

워크 플로우는 다음과 같습니다. 주어진 페이지에 모달을 여는 버튼이 있습니다. 모달을 열면 소켓 팩토리가 모달 컨트롤러에 삽입되고 socket.io 서버에 연결됩니다. 소켓이 연결될 수 있으면이 모든 것이 잘 작동합니다. 모달이 닫히면 $ scope.destroy가 호출되고 모달 컨트롤러의 핸들러가 소켓 정리를 시도합니다.

이 모달은 여러 번 닫거나 다시 열 수 있습니다. 소켓을 여러 번 생성/파괴하는 과정이 내 문제의 일부일 수 있습니다. 이것이 올바른 패러다임이 아닐 수도 있지만, 모달이 닫히면 소켓과 상호 작용할 방법이없고 그 페이지가 소켓에 남아 있습니다. 존재하거나 연결 상태를 유지해야합니다.

소켓 생성 :

angular.module('app.common.newSocketFactory', ['btford.socket-io']) 
.factory('newSocketFactory', ['socketFactory', function(socketFactory){ 

return function(){ 
    return socketFactory({ioSocket:io.connect('http://localhost:3000', {forceNew: true})}); 
}; 

}]); 

주입 :

여기
angular.module('...', [ 
    'app.common.newSocketFactory', 
    .... 
]) 
.controller('Controller', ['$scope', '$modalInstance', 'newSocketFactory', ... 
    function ($scope, $modalInstance, newSocketFactory, ...){ 
    ... 

    $scope.socket = newSocketFactory(); 

내 파괴 핸들러 : 모달이되기 전에 소켓을 연결할 수있을 때

$scope.$on('$destroy', function(){ 
    $scope.socket.emit('unlisten'); 
    $scope.socket.disconnect(); //have tried passing true too. 
}); 

이 제대로 작동 닫힌 경우 서버의 연결이 끊긴 이벤트는 클라이언트 연결이 끊어진 것을 관찰합니다. 또한 모달을 닫은 다음 서버를 종료하고 다시 연결하려고 시도하지 않습니다.

모달을 열 때 서버가 종료되면 TransportErrors가 발생하고 다시 연결 시도가 이루어집니다. 이 시점에서 모달을 닫으면 오류가 계속 발생하고 서버를 다시 시작하면 다시 시도가 성공하고 클라이언트가 서버에 연결됩니다. 최악의 부분은이 소켓을 사용하여 하드웨어에 대한 원자 적 액세스를 유지하는 것이며, 이는 첫 번째 소켓에 의해 잠긴다. 서버를 다시 시작하지 않고 소켓 연결을 허용 한 다음 모달을 닫습니다 (분리 범위에서 $ destroy 및 socket.disconnect()). 전체 페이지를 새로 고쳐 소켓을 파괴해야합니다.

잠재적으로 angular-socket.io 질문 또는 일반적인 socket.io 고객 질문입니다. angle-socket.io의 github에서 아무런 응답없이 angular-socket.io 클라이언트 소켓을 적절하게 처리하는 방법에 대한 응답없이 요청했습니다.

내 질문은 다음과 같습니다. A) socket.io를 사용하여 주요한 가짜를 작성하지 않으면 어떻게 안전하게이 클라이언트 소켓을 처리 할 수 ​​있으며 B) 내가 잘못했는지, 더 좋은 방법은 무엇입니까? 페이지마다 유지되지 않는 websocket을 관리하려고합니다.

참고 : angular-socket.io 소켓은 각도 범위 처리에 도움이되도록 네이티브 소켓을 간단하게 포장합니다. disconnect()를 호출하면 결과는 기본 소켓 자체처럼 보입니다. false 설정 등의 설정을 다시 시도했지만 그 중 아무 것도 작동하지 않습니다. 그리고 연결 시도를 중단하기 위해 해킹 할 수 있다고해도 범위가 완전히 파괴 된 후에도 소켓이 여전히 존재하는 것 같지 않습니다.

감사

답변

1

나는 그래서 예를 들어, 내 자신의 재 연결 논리를 만들려고 할 것 ... 내가 SocketIO이 적어도 말을 지저분한 상태 관리를 가지고 결론을했다 유사한 문제를 처리 할 때 연결 해제 또는 오류시 재 연결을 비활성화하고 원하는 경우에만 다시 연결하십시오.

나는 또한 (stuff) => $timeout(() => myHandler(stuff))과 같은 상태 핸들러가있는 네이티브 SocketIO를 사용하고 주변에 싱글 톤 각도 서비스를 배치하는 것을 고려할 것입니다. 이 방법은 당신의 머리가 모달을 닫거나 스코프를 잃어버린 것에 대해 걱정하지 않을 것입니다.

또한 결과를 보내주십시오.

+1

안녕하세요, 답장을 보내 주셔서 감사합니다. 나는 최근에이 일을하지 않았으며 곧 다시 작업 할 수있는 기회를 가지지 않을 것입니다. (기능은 오래 동안 자극을 받아 안정적으로 보입니다.) 우리가 정상적으로 수행 한 최종 결과는 forceNew = true로 설정 (io.connect로 전송 됨)을 설정하는 것이 었습니다. 거기에서 수동으로 소켓을 만듭니다. var ioSocket = io.connect (URL + ':'+ PORT, options); var socket = socketFactory ({ioSocket : ioSocket}); 거기에서 연결을 끊으려고하면 먼저 소켓의 모든 수신기를 제거한 다음 socket.disconnect()를 호출하십시오. 지금까지 우리에게 도움이되었습니다. –

+0

감사합니다. 우리는 강제 재 연결을 사용하고 disconnect()도 수동으로 호출했습니다. SocketIO 사람들이 신뢰할 수있는 상태 머신이나 뭔가를 만들 수 있기를 바랍니다. –