2012-02-18 5 views
2

バッファから文字列を読み込んでサーバーに書き込んでいます。私が抱えている問題は、ソケットを開いたままにしてループを書くと、文字列がサーバーによって受信されないということです。 私はこれを使用する場合:writeBytesを使用したJavaクライアントソケット

try {  
     Socket send = new Socket("localhost", 1490); 
     DataOutputStream out = new DataOutputStream(send.getOutputStream()); 
     String message = null; 
     while ((message = buffer.get()) != null){ 
      out.writeBytes(message); 
     } 
     out.close(); 
     send.close(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

をサーバが文字列を受信しませんが、私はこれを行うと、それが正常に動作:

try {  

     String message = null; 
     while ((message = buffer.get()) != null){ 
      Socket send = new Socket("localhost", 1490); 
      DataOutputStream out = new DataOutputStream(send.getOutputStream()); 
        out.writeBytes(message); 
      out.close(); 
      send.close(); 
     } 

    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

もちろん、私は、開閉維持する必要はありませんしかし、ソケット。何が問題ですか?

答えて

0

データを閉じてもデータがソケットに書き込まれていませんか? (あなたの最初のスニペットにあります)

また、フラッシュメソッドを使用しようとしましたか? (http://docs.oracle.com/javase/1.4.2/docs/api/java/io/DataOutputStream.html#flush)をし、あなたのコードは次のようになります:あなたはここでそれについて読むことができます

try {  
    Socket send = new Socket("localhost", 1490); 
    DataOutputStream out = new DataOutputStream(send.getOutputStream()); 
    String message = null; 
    while ((message = buffer.get()) != null){ 
     out.writeBytes(message); 
     out.flush(); 
    } 
    out.close(); 
    send.close(); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 
+0

はい、私はフラッシュを試みましたが、私はまだ同じ問題があります。バッファは常に文字列を持っているので、ソケットが実際に閉じないとは思わない。しかし、なぜ私のメッセージはまだ届いていないのですか? – user1190650

1

あなたのソケットは、データパケットを送信するたびにフラッシュする必要があります。 ソケットを閉じると自動フラッシュが強制され、データがソケットクローズで送信される理由が説明されます。

0

私に推測させてください。

buffer.get()メソッドのブロックはありますか?もしそうなら、問題はout.writeBytes(message)がバイト表現全体がサーバにプッシュされることを保証しないということです。代わりに。クライアントがサーバーにフラッシュされるのを待っているバッファーされたバイトを持っている可能性があります。

これが起こっている場合は、writeBytesを呼び出すたびにflushを呼び出して問題を解決します。

しかし、buffer.get()メソッドがブロックされない場合、flushを呼び出しても差は生じません。実際には、ネットワークトラフィックが増加するだけです。だから、 "ちょうどその場で"フラッシュを追加することは悪い考えです。


もう1つの可能性は、サーバー側コードに問題があることです。

+0

ありがとうございます。はい、buffer.get()はブロックしますが、writeBytesを呼び出すたびにバッファをフラッシュしてみましたが、同じ問題が残っています。他のアイデア? – user1190650

+0

私の答えの最後の文章をもう一度お読みください。 –