2017-12-16 7 views
0

나는 var remote = net.connect(); remote.write(data) && ..., 나는 원격 데이터를 쓰는 경우를 나타내는 boolean를 얻을 수있는 경우에?Websockets의 net.connect(). write()는 무엇입니까? 원격 데이터를 쓰는 경우</p> <pre><code>var remote = new WebSocket('???', { protocol: 'binary' }); </code></pre> <p>는 어떻게 알 수 있습니까 : 나는 그래서 만약 예를 들어

+0

사용중인 websocket 라이브러리는 무엇입니까? – jfriend00

+0

@ jfriend00 https://www.npmjs.com/package/ws –

+0

WebSocket 프로토콜은 TCP 소켓 프로토콜 위에 구축됩니다. WebSockets은 TCP 소켓이 제한되지 않는 특별한 방법으로 데이터를 형식화합니다. 당신이 알지 못하는 경우에 대비하여 알려주는 것. –

답변

0

내가 말하는 내용을 문서화 한 방법이 보이지 않으므로 라이브러리에 대해 source code을 조사하고 어떤 것을 찾을 수 있는지 확인해야합니다.

우선은 웹 소켓 클래스 자체는 EventEmitter이며 실제 TCP 소켓입니다 _socket이라는 속성이 포함되어 있습니다. 그렇게해야한다면 직접 액세스 할 수 있습니다.

_socket 속성은 here으로 초기화됩니다.

send() 방법은 here으로 정의됩니다. 가장 먼저 알아야 할 것은 반환 값이 없으므로 remote.write()에서 얻은 결과를 반환하지 않는다는 것입니다. 대신, 송신 로직은 오브젝트 here으로 구현되며, 올바른 프레임 포맷을 구축 한 후 궁극적으로 sendFrame()here을 호출합니다. 당신이 라이브러리의 코드를 수정하지 않고 사용할 수 없습니다 있도록 socket.write()의 반환 값이 무시되는 것을 볼 수 있습니다

sendFrame (list, cb) { 
    if (list.length === 2) { 
     this._socket.write(list[0]); 
     this._socket.write(list[1], cb); 
    } else { 
     this._socket.write(list[0], cb); 
    } 
    } 

을 그리고 : 거기 당신은 실제의 소켓이이 글을 볼 수 있습니다.

쓰기 버퍼가 가득 찼을 때 알 수있는 방법을 솔직하게 모르겠습니다. 쓰기 버퍼가 꽉 찼을 때 알려주고 그 내용을들을 수 있다고 알려주는 소켓 객체에는 drain 이벤트가 있습니다. 그러나 가득 차면 언제 지원되는지 알 수 없습니다. 외부에서 할 수있는 한 가지 방법은 _socket.write() 메서드를 재정의하고 버퍼가 가득 차면 webSocket 객체에 자신의 이벤트를 내 보냅니다.

에서 값을 반환하는 반환 값을 .send()에서 만드는 것이 가장 깨끗한 해결 방법 인 것처럼 보이지만, 라이브러리를 분기하고 몇 곳에서 코드를 수정해야합니다.

나는 우리가 뭔가를 놓친 경우 나 이에 대한 대처 방법에 대한 다른 아이디어가있는 경우를 대비하여 issue with the webSocket Github project을 제출했습니다.


이이 문제를 처리하는 방법이 ws.send(data, callback)에 전달 될 수있는 콜백을 사용하는 것입니다 here을 제안하고 데이터가 실제로 전송 될 때 콜백이 호출됩니다. 이것은 당신이 요구 한 것이 아니며 원래 질문을 처리하기 위해 the issue I filed on Github에서 제안 된 것입니다.

+0

@AeroWang - 내가 제출 한 Github 문제에 대한 의견을 바탕으로 답변 끝에 메모를 추가했습니다. – jfriend00