2013-06-27 4 views
3

JavaScript의 Firefox 부가 기능 내에서 소켓 연결 (발신, nsIServerSocket에서 수신 대기하지 않음)을 열고 싶습니다. 연결은 지정된 포트의 TCP에서 localhost로 연결되어야하며 시스템에서 실행중인 다른 프로세스와 통신하는 데 사용됩니다.Firefox 부가 기능에서 소켓 연결 열기

어떻게 이러한 클라이언트 소켓을 열 수 있습니까? developer.mozilla.org에서 nsISocketTransport와 같은 인터페이스에 대한 API 설명서를 찾았지만 아직 그 부분을 함께 사용하는 데 도움이되지 않습니다. 그것은 심지어 소켓이 TCP를위한 것일 수도 있음을 언급하지 않는다. 그래서 나는 이것이 내가 필요로하는 인터페이스라고 확신하지도 않는다. 지금까지 찾을 수있는 것은 nsIServerSocket에 관한 것입니다. 참고 : 추가 기능 SDK를 사용하지 않고 직접 부트 스트랩 된 추가 기능을 사용합니다.

답변

2

당신은 올바른 길을 가고 있습니다. 나는 프로세스 간 통신을 가능하게하기 위해 KeeFox에서 nsISocketTransport와 nsISocketTransportService를 사용하지만 그림을 완성시키는 관련 리스너와 콜백 인터페이스입니다. a의 사용으로 인해 발생하는 보안 예외를 서버 포트에 연결하는 정기적 인 시도를하고 처리, https://github.com/luckyrat/KeeFox/blob/master/Firefox%20addon/KeeFox/modules/session.js

그것은 특정 포트에 보안 TCP 연결을 엽니 다 :

이 파일은 몇 가지 유용한 예제 코드를 포함해야 자체 서명 된 인증서.

난 당신이 정확한 상황에 따라 약간 다른 사람이 필요할 수 있지만 다음과 같은 인터페이스를 사용

이러한 인터페이스에 정의 된 콜백의 일부에 기본 세션 객체의 프로토 타입을 확장이 두번째 파일에 포함되어
QueryInterface: XPCOMUtils.generateQI([Ci.nsIBadCertListener2, 
             Ci.nsIInterfaceRequestor, 
             Ci.nsIStreamListener, 
             Ci.nsITransportEventSink, 
             Ci.nsIOutputStreamCallback]) 

https://github.com/luckyrat/KeeFox/blob/master/Firefox%20addon/KeeFox/modules/json.js

https://github.com/luckyrat/KeeFox/blob/master/Firefox%20addon/KeeFox/modules/KF.js 일부 타이머를 생성하고 연결 프로를 시작합니다 KeeFox 사용하는 특정 통신 프로토콜 (JSON-RPC)를 적용 아래 코드를 따라 가라.하지만 아마 그 파일을 자세히 살펴볼 필요는 없을 것이다.

this.KeePassRPC = new jsonrpcClient(); // defined in json.js and session.js 

// make the initial connection to KeePassRPC 
// (fails silently if KeePassRPC is not reachable) 
this.KeePassRPC.connect(); 

// start regular attempts to reconnect to KeePassRPC 
this.KeePassRPC.reconnectSoon(); 

관심있는 분은 원시 TCP 연결을 사용해야합니까? 그것은 4 년 전 KeeFox를 만들었을 때의 유일한 선택 이었지만, 현재 Web Socket 솔루션을 사용하고 있습니다. 그래서 여러분이 아직 선택하지 않았다면 그 옵션에 대해서 생각할 가치가 있습니다. 원시 소켓 인터페이스 주변에서 머리를 쓰는 것보다 훨씬 간단합니다.

+0

감사 : 특히

, 이것은 내가 지금 HTTP 요청을하고 응답을 받기 위해 사용하는 코드입니다! 네 말이 맞아, 난 원시 소켓이 필요 없어. 나는 그렇게 생각했지만, 내 서버가 대신 POST 페이로드 데이터가있는 HTTP와 같은 요청을 원한다는 것을 알았으므로 지금은 대신 nsIHttpChannel을 사용하고 있습니다. –

+0

그러나 앞으로 사용하기를 원하는 다른 서버 구성 요소는 원시 소켓 연결이 필요하므로 어쨌든이 구성 요소를 사용해야 할 수도 있습니다. HTTP가 아닌 연결에 일반 nsIChannel (또는 그 이상)을 사용하는 방법이 있습니까? –

+0

네, 매우 비슷하지만 인증서에 대해 걱정할 필요가 없습니다. session.js의 101 줄은 비보안 연결에서 사용할 수있는 주석 처리 된 버전입니다. var transport = transportService.createTransport (null, 0, this.address, this.port, null); – Luckyrat

1

위에서 주어진 대답은 내 원래 질문에 매우 좋지만, 지금 내가 대신하고있는 것을 게시하는 것이 흥미로울 수 있다고 생각합니다. 서버가 원시 연결을 신경 쓰지 않고 대신 HTTP를 원한다는 것을 알았습니다 요청. 이를 위해 매우 유용한 정보 출처는 https://developer.mozilla.org/en-US/docs/Creating_Sandboxed_HTTP_Connections이며 nsIHttpChannel에 대한 API 페이지와 거기에서 연결된 몇 가지 인터페이스 (nsIUploadChannel, 입력 스트림 등)입니다. 정교한 답변

var ch = NetUtil.newChannel (HTTP_URL); 
ch.QueryInterface (Components.interfaces.nsIHttpChannel); 
// Here you can set HTTP request headers, like authorization. 

var s = Components.classes["@mozilla.org/io/string-input-stream;1"] 
     .createInstance (Components.interfaces.nsIStringInputStream); 
s.setData (DATA_FOR_SERVER, DATA_FOR_SERVER.length); 
ch.QueryInterface (Components.interfaces.nsIUploadChannel); 

// I have JSON data, otherwise change the MIME type. 
ch.setUploadStream (s, "application/json", -1); 
ch.requestMethod = "POST"; 

s = ch.open(); 
var avail = s.available(); 
if (avail === 0) 
    { 
    s.close(); 
    throw "Connecting failed."; 
    } 

var string = NetUtil.readInputStreamToString (s, avail, null); 
s.close(); 

dump ("Response code: " + ch.responseStatus); 
dump ("Response data: " + string); 
관련 문제