2016-03-31 7 views
0

私はteamviewerに似たものを作ろうとしています。私のサーバはクライアントにコマンドを送信し、クライアントはスクリーンショットを送信します。私はJLabelでこれらを表示し続けます。他のコマンドは "ストリームオーディオ"と言うと、クライアントストリームのオーディオをデスクトップストリームと共に(サーバーはどのデータが受信されたのかを理解できるはずです)どうすればできますか? NIOを使うべきですか?私は、NIOが複数の出力を記述し、複数の出力を読み出すのにどのように役立つのか理解していません。複数のストリームを正しく送受信する方法

編集-例えば、私のサーバはコマンドを送信し、クライアントは新しいスレッドで画面をストリームし、サーバは再びオーディオを取得するコマンドを送信し、クライアントはオーディオを取得するために他のスレッドを開始します。サーバーに2バイトが入ってきたら、私のサーバーはそれをどのように正しく処理できますか?

+0

NIOはほとんどが途中で入ります。各ストリームの前にストリーム識別子と長さを送信する必要があります。 DataInput/OutputStreamsは行く方法です。 – EJP

+0

@EJP DataInputStreamとDataOutputStreamを使用し、それらをbyte []に​​変換して送信し、そこにイメージを再作成します。クライアント/サーバアーキテクチャは、クライアントに応答を送信した場合のみ、私は画像のバイトと一緒に送ると画像が壊れますか? –

+0

私がすでに言ったように、長さとともにそれを最初に送ってください。 * *画像バイトの前。型にはshortまたはintがあり、長さにはint(おそらく)があります。 – EJP

答えて

0

各ストリームの前にストリーム識別子と長さを送信する必要があります。 NIOはほとんどが途中で入ります。 DataInput/OutputStreamsは行く方法です。

型にはshort型またはint型があり、長さにはint型(おそらく)です。

dos.writeShort(type); 
dos.writeInt(length); 
dos.write(data); 

と...

int type = dis.readShort(); 
int length = dis.readInt(); 
byte[] buffer = new byte[length]; 
dis.readFully(buffer); 

あなたが送信するためのコマンドを持っているときにコマンドを送信する必要がありますが、クライアントはあなたが読むに永続的にある別のスレッドを必要とし、送信されたすべてのものを読むために( )ループが切断されるまでループします。

読み取りまたは書き込み中にIOExceptionがスローされた場合、クライアントを切断するのは正しいですか?遅延のような他の理由が原因である可能性がありますか?

IOExceptionのソケットは、 `SocketTimeoutException以外のもので閉じてください。

+0

ありがとう@EJP、短い、ああ、私は、SocketTimeoutを除く参照してください大丈夫 –

関連する問題