2017-06-11 8 views
0

私はwsパッケージを使用してnodeJSにWebソケットを作成しています。NodeJS Websockets - データ送信後にソケットを終了する

しかし、データがサーバーに送信されると、ソケットは終了する必要があります。私はこれをどうやってやるのか分からない。

私のコードは今のように見えますが、ここでの問題はデータが送信される前に終了する可能性があります。

 ws.on('open', function open() { 
     console.log('subscribing'); 
     ws.send(creds); 
     ws.terminate(); 
     resolve(1); 
    }); 

これを実行する正しい方法は何ですか。

答えて

-1

EDIT:私はクライアント側をサーバー側に切り替えても構いませんが、コンセプトは変わりません。返信するには確認信号が必要です。

これはウェブソケットの問題ではありません。むしろTCP/IPの問題です。データを送信すると、ネットワークアダプターのバッファーからフラッシュされたタイミングを知ることができますが、最後のパケットがいつ他のエンドポイントに到着したかを知ることはできません。

これはすべてのTCP/IP接続に共通する問題であり、いくつかの使用例で私が見つけた唯一の確実な解決策は、このようにクライアントにACK(確認応答)を返すことです。メッセージを受信すると、サーバ上で

、:クライアントで

ws.send(""); // acknowledge the server received the message 
// don't close the connection, linger instead 
// process the message... 

:あなたが気づくことのよう

// create ws and immediately set a flag 
ws.lingering = false; 

// attach receive event before you open the socket 
ws.on("data", function() { 
    if (ws.lingering) 
    { 
    // now you can terminate the connection 
    ws.terminate(); 
    resolve(1); 
    } 
}); 

// now open the socket and send message without terminating, yet 
ws.on("open", function() { 
    console.log("subscribing..."); 
    ws.send(creds); 
    ws.lingering = true; 
}); 

、サーバーから送信されたメッセージは、クライアント上でチェックされません、それは単に待つ信号です。

0

これは、あなたが正常に終了する方法です:

ws.close() 

しかし、クライアントが戻ってあなたに答えない限り、データがクライアントに到着したときに、サーバーから知ることができない土器こと。ですから、別のイベントを作成し、クライアントがデータを受信して​​返信したことを確認してから、そのイベントでの接続を終了してください。

ws.on('open', function open() { 
    console.log('subscribing'); 
    ws.send(creds); 
}); 

    ws.on('credsanswer', function incoming(message) { 
    //user has received creds ands calls us back 
    ws.close() 
}); 
関連する問題