2017-01-08 5 views
1
私は2つのデバイスは、 Socket

DataOutputStreamの書き込み()

サーバコード介して接続されている

- (Androidアプリ):

log("sending song to client - " + clientSocket.getInetAddress().toString()); 

      InputStream fileInputStream = new FileInputStream(songFile); 
      socketDataOutputStream.writeLong(songFile.length()); 
      Thread.sleep(50); 
      byte[] byteBuffer = new byte[16 * 1024]; 
      int count; 
      while ((count = fileInputStream.read(byteBuffer)) > 0) { 
       socketDataOutputStream.write(byteBuffer, 0, count); 
      } 
      log("song sent to client - " + clientSocket.getInetAddress().toString()); 
      socketOutputStream.flush(); 
      log("sending a message to client - " + clientSocket.getInetAddress().toString()); 
      socketDataOutputStream.writeUTF("play"); 
      log("message sent to client - " + clientSocket.getInetAddress().toString()); 

クライアントコード - (PCコード):

OutputStream fos = new FileOutputStream(song); 
     InputStream sis = socket.getInputStream(); 
     DataInputStream dis = new DataInputStream(new BufferedInputStream(sis)); 
     long size = dis.readLong(); 
     int count; 
     log ("Receiving file"); 
     while (size > 0 && (count = dis.read(buffer, 0, (int) Math.min(buffer.length, size))) != -1) { 
      fos.write(buffer, 0, count); 
      size = size - count; 
     } 
     fos.close(); 
     log ("File received"); 
     String s; 
     while ((s = dis.readUTF()) != null) { 
      log(s); 
     } 

ソングは正常に受信されますが、その後はソケットとの通信は不可能です!私はさまざまな方法で試しました - PrintWriterwrite(bytes[])。何も起こらない - クライアント側のコードは、2番目のwhileループに入りません。

私は何をしているのか分かりません。

+0

'socketOutputStream'を閉じますか?もしそうでなければ、 'readUTF()'はあなたがもっと多くのデータを送るつもりであるかどうかを知っていて、遅くなっていますか? – Andreas

+0

あなたのコメントを説明できますか? – Shantanu

+1

Hmmm ...申し訳ありませんが、私は間違っている間も正しいでしょう。サーバーはストリームをクローズしないので、ストリームの終わりの信号はクライアントに送信されず、単にそこに座ってより多くのデータを待つだけです。しかし、あなたは[readUTF() '](https://docs.oracle.com/javase/8/docs/api/java/io/DataInput.html#readUTF--)が'ヌル? javadocはそれが可能であるとは言いません。実際には、ストリームの終わりが代わりに 'EOFException'を引き起こすと言います。あなたはそれを得られないので、私の最初の観察は真実であると思われます:メソッドはより多くのデータを待っています。 – Andreas

答えて

3
while ((s = dis.readUTF()) != null) { 
     log(s); 

これを削除します。それは意味をなさない。 readUTF()はnullを返さないので、入力を捨てるべきではありません。これは"play"コマンドを受け取ることになっている場合

、あなたはStringreadUTF()結果を格納する必要があり、その後は、それが適切に"play"比較します。しかし、コマンドは冗長です。あなたはそれを受け取ったらすぐにそれを再生することができます、そして、あなたはそれがいつあるかを知っています。

睡眠は文字通り時間の無駄です。それも削除します。

+0

@andreasが問題を解決しました!どうもありがとう! – Shantanu

+2

彼はその一部を解決しました。あなたが投稿したコードでは、 'flush()'の必要性は明らかではありません。上記のループは依然として間違っており、上記のように除去または改善が必要であり、睡眠はまだ時間の無駄です。 – EJP

+0

なので 'while = true 'の中に' s = dis.readUTF() 'を書いて、それが" play "と等しいかどうかをチェックします。右? – Shantanu

関連する問題