私は、C#クライアントからTCPソケットを使ってJavaサーバーにファイルを転送しています。 C#クライアントでは、ファイルをバイト配列に変換して送信し、NetworkStreamを使用して送信します。JavaでC#バイト配列を読み取る
Javaサーバーでは、受信したバイト配列をファイルに変換するために次のコードを使用します。
public void run() {
try {
byte[] byteArrayJAR = new byte[filesize];
InputStream input = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(
"Controller " + controllerNumber + ".jar");
BufferedOutputStream output = new BufferedOutputStream(fos);
int bytesRead = input.read(byteArrayJAR, 0, byteArrayJAR.length);
int currentByte = bytesRead;
System.out.println("BytesRead = " + bytesRead);
do {
bytesRead = input.read(
byteArrayJAR,
currentByte,
(byteArrayJAR.length - currentByte));
if (bytesRead >= 0) {
currentByte += bytesRead;
}
}
while (bytesRead > -1);
output.write(byteArrayJAR, 0, currentByte);
output.flush();
output.close();
socket.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
上記のコード受け取ったバイト配列は、Javaでプログラムされたクライアントから来ているが、C#のクライアントのためのコードは、DO-whileループbytesRead = input.read(...)メソッドでにハングアップします。場合は動作します
誰かが、この時点でC#クライアントではなくJavaクライアントでコードがハングしている理由を知っていますか? printlnメッセージの出力によれば、データはInputStreamによって確実に受信されており、bytesRead変数の初期化時に1回読み込まれますが、do-whileループ中は読み込まれません。
この問題を解決するための解決策または提案は歓迎されます。
ありがとうございます。
Midavi。基づいて
私たちにあなたのC#コードを教えてください。おそらく 'Flush()'が欠けていますか? – dtb
ファイルサイズが有効に送信されたデータ以下でない場合、read()はブロックされます。受信しようとしているデータのサイズを決して推測しないでください。ストリームが空になるまで読書を続ける必要があります。 – Viruzzo