2012-04-25 6 views
0

FFアドオンからJavaサーバーにソケットを介して書きます。私はいくつかのリクエストを書いており、サーバーはそれらを1つずつ処理しているようです。対照的に、サーバーからの応答はすべて同時に処理されます。コード内のソケットをフラッシュする方法

サーバでアウトストリームをフラッシュしてみましたが、何もしません。私は何が起こっているのか分からない。

ご協力いただきありがとうございます。

EDIT1:アドオン(クライアント)が入力ストリームをフラッシュしていない可能性がありますか?私はjavaサーバでout.printlnを使用していますので、 '\ n'は出力ストリームをフラッシュし、ネットライブラリはwrite.flush()を使用しますが、入力に対して他のフラッシュは表示されません。

EDIT2は:ここに私のコードです:

Client > hi1 
Client > hi2 
Server > bye1 
Server > bye2 

そして、それは次のようになります:

exports.main = function() { 
    try { 
     // At first, we need a nsISocketTransportService 
     var transportService = 
      Cc["@mozilla.org/network/socket-transport-service;1"] 
      .getService(Ci.nsISocketTransportService); 

     // Try to connect to localhost:2222 
     var transport = transportService.createTransport(null, 0, "localhost", 6666, null); 

     var stream = transport.openInputStream(Ci.nsITransport.OPEN_UNBUFFERED,null,null); 
     var instream = Cc["@mozilla.org/scriptableinputstream;1"] 
      .createInstance(Ci.nsIScriptableInputStream); 

     // Initialize 
     instream.init(stream); 
     var outstream = transport.openOutputStream(0, 0, 0); 



     var dataListener = { 
      onStartRequest: function(request, context){}, 

      onStopRequest: function(request, context, status){ 
       instream.close(); 
       outstream.close(); 
      }, 

      onDataAvailable: function(request, context, inputStream, offset, count) { 
       var data = instream.read(count); 
       console.log(data);    
      }, 
     }; 

     var pump = Cc["@mozilla.org/network/input-stream-pump;1"] 
       .createInstance(Ci.nsIInputStreamPump); 
     pump.init(stream, -1, -1, 0, 0, false); 
     pump.asyncRead(dataListener, null); 

     // Write data 
     console.log("hi1"); 
     var outputData = "hi1\n"; 
     outstream.write(outputData, outputData.length); 

     // Write data 
     console.log("hi2"); 
     var outputData = "hi2\n"; 
     outstream.write(outputData, outputData.length); 

    } catch (e){ 
     console.log("Error" + e.result + ": " + e.message); 
     return e; 
    } return null; 
}; 

だから、私はそれを実行すると、私が手

Client > hi1 
Server > bye1 
Client > hi2 
Server > bye2 
+0

コードなし、ヘルプなし。 –

+0

@MarkoTopolnik:あなたが見たいと思ったら、いくつかのコードを追加しました。 – synack

+0

これをJavaとタグ付けしましたが、問題のJavaとの関連はありません。タグを付けなかった場合、この会話はできません。私はJavaScriptの専門家ではない。 –

答えて

0

出力ストリームに同期的に書き込んでいます。つまり、実行中に他のJavaScriptコードを実行することはできません。書き込み中にサーバーから何かを受信することは不可能です。受信データは単にバッファーに入れられます。

もう1つの問題は、サーバーからの応答を待たずに次の文字列を送信していることです。通常、サーバー応答が到着する前に、両方を送信できます。前の文字列への応答を受け取ったときにのみ、次の文字列を送ることをお勧めします。

あなたはおそらくこの1のような送信機能を使用したい:

Components.utils.import("resource://gre/modules/NetUtil.jsm"); 

var toSend = ["hi1\n", "hi2\n"]; 

function sendNextString(outstream) 
{ 
    if (!toSend.length) 
    return; // Nothing left to send 

    var outputData = toSend.shift(); 
    console.log(outputData); 
    var instream = Components.classes["@mozilla.org/io/string-input-stream;1"] 
          .createInstance(Components.interfaces.nsIStringInputStream); 
    instream.setData(outputData, outputData.length); 

    NetUtil.asyncCopy(instream, outstream); 
} 

そして、あなたはpump.asyncRead()後だけでなく、onDataAvailableにあなたのコードでsendNextString(outstream)を呼び出します。

PS:私が知る限り、ストリームのフラッシュはではありません。ここでは、バッファリングされていないストリームを使用しています。

+0

ありがとう!それは私をたくさん助けました。完璧には機能しませんが、sendNextStringをonDataAvailableに呼び出すと、サーバーは何も受け取りません。奇妙なことが起こっている、あなたはどう思いますか? (質問のコードを更新しました) – synack

+0

@ user1336939:コードのデバッグを開始する必要があると思います。「奇妙なことが起こっています」ということを少しでも伝える必要があります。 –

+0

しかし、私はサーバーをデバッグし、何も受信しません。アドオンをどのようにデバッグできますか?ありがとう – synack

0

TCPがありますストリームプロトコルであるため、バイトストリームを受信します。パケットが必要な場合は、それらを分離できるようにTCP上で独自のプロトコルを実装する必要があります。このトピックはインターネットで広くカバーされています。

編集

これは、ソケットプログラミングでよくある落とし穴です。ほとんどの人は、最初にTCPソケットがストリームでありメッセージキューではないことを理解していません。

つまり、ソケットの一端で「送信」を呼び出すと、必ず相手側で「受信」するに対応していません。下層レイヤは、任意に送信されたバイトをグループ化または分割することを決定できます。

ですから、このようなものができます。クライアントは、クライアントが "EFGH"

  • サーバは "AB"
  • サーバは "CDEF"
  • を受けて送受信する "ABCD"
  • を送信

    • をサーバは「GH」を受信する

    これはiストリームではなく、メッセージキューです。それをあなたが読み込んでいる無限のファイルと考えてください。

    したがって、ファイルから文字列を読みたい場合は、それらを分離する方法が必要です。区切り文字にすることもできますし、文字列の長さなどで文字列に接頭辞を付けることもできます。

  • +0

    しかし、私はサーバーに問題はありません。「\ n」を取るとストリームをフラッシュします。クライアントは、それ以外の場合は、単に '\ n'を出力します。私は自分のプロトコルを実装することで何を意味するのか分かりません。メッセージの種類ごとにオペコードを指定すると、続きを読む?私は見上げることができるソースがありますか?ありがとうございました。 – synack

    +0

    @ user1336939が編集されました。 –