2016-09-19 9 views
0

私はその入力広告出力ストリームを持つソケットを持っています。私は出力を同期して使用し、非同期で入力し、入力をブロックせずに受信したすべてを保存したい。入力ストリームから非同期で読み込む方法はありますか?

Socket socket; 
BufferedOutputStream outToServer; 
DataInputStream inFromServer; 
List<byte[]> incoming=ArrayList<byte[]>(); 


socket = new Socket(); 
socket.connect(new InetSocketAddress("127.0.0.1",9100), 5000); 
outToServer = new BufferedOutputStream(socket.getOutputStream()); 
inFromServer = new DataInputStream(socket.getInputStream()); 

着信リストを入力データで埋めるために入力リスナーを追加するにはどうすればよいですか?

答えて

1

基本的に、java.nioパッケージを調べたいとします。かなりの年月が経ってから、標準のJavaで "非同期"、 "ノンブロッキングIO"を行うための完全なサポートがあります。

いくつかの例については、hereを参照してください。そのチュートリアルは、基本的にあなたの質問に書いたようにコードから始まります。それを "非同期"に変換します。

正確には、「nio」または「nio2」を使用する必要はありません。しかし、あなたがその方向性に真剣に取り組んでいるなら、nio/nio2は非常に役に立つ機能を提供します。

+0

でも、同期書き込みと非同期読み取りを区別して使用できますか? – Tobia

+0

サーバー側ではnioの例がありますが、クライアント側ではありません。 – Tobia

+0

非同期の読み込みやストリームへの書き込みは、そのストリームがサーバーまたはクライアント上で使用されている場合は重要ですか? – GhostCat

0

非同期で実行する必要があるRunnableには、InputStreamを渡す必要があります。これは、例えばコンストラクタで行うことができます。

public class ConsumeInput implements Runnable { 
    private InputStream inputStream; 

    public ConsumInput(InputStream inputStream) { 
     this.inputStream = inputStream; 
    } 

    public void run() { 
     // Do something with inputStream 
    } 

} 

そして、メインスレッドあなたはまた、スレッドを処理するための新しいAPIを使用することができます明らかに

... 
ConsumeInput consumeInput = new ConsumeInput(inFromServer); 
Thread t = new Thread(consumeInput); 
t.start(); 

インチ

注:これはスケルトンコードに過ぎません。ストリームの例外やクロージャを処理する必要があります。

+0

run()に何を入れるべきですか? List 受信したコンテンツを読み込む必要がありますが、ループをブロックして新しいコンテンツを待つことはできますか? – Tobia

+0

データを読み取るためにメインスレッドで使用するのとまったく同じコードをrunメソッドに入れる必要があります。 –

+0

メインスレッドでは、私が必要とするもの(4バイト)だけを読んでからすべてを破棄しましたが、今度は入力ストリームから受信したすべてを消費しなければなりません。 ベスト・オプションは、データが利用可能なときにメソッドを起動するイベント・リスナーです。 – Tobia

関連する問題