Socket
サーバコード介して接続されている
- (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);
}
ソングは正常に受信されますが、その後はソケットとの通信は不可能です!私はさまざまな方法で試しました - PrintWriter
、write(bytes[])
。何も起こらない - クライアント側のコードは、2番目のwhile
ループに入りません。
私は何をしているのか分かりません。
'socketOutputStream'を閉じますか?もしそうでなければ、 'readUTF()'はあなたがもっと多くのデータを送るつもりであるかどうかを知っていて、遅くなっていますか? – Andreas
あなたのコメントを説明できますか? – Shantanu
Hmmm ...申し訳ありませんが、私は間違っている間も正しいでしょう。サーバーはストリームをクローズしないので、ストリームの終わりの信号はクライアントに送信されず、単にそこに座ってより多くのデータを待つだけです。しかし、あなたは[readUTF() '](https://docs.oracle.com/javase/8/docs/api/java/io/DataInput.html#readUTF--)が'ヌル? javadocはそれが可能であるとは言いません。実際には、ストリームの終わりが代わりに 'EOFException'を引き起こすと言います。あなたはそれを得られないので、私の最初の観察は真実であると思われます:メソッドはより多くのデータを待っています。 – Andreas