Estoy transfiriendo un archivo de un cliente C# a un servidor Java utilizando sockets TCP. En el cliente C#, convierto el archivo a una matriz de bytes para su transmisión y lo envío utilizando un NetworkStream.Lectura de una matriz de bytes C# en Java
En el servidor Java utilizo el siguiente código para convertir la matriz de bytes recibida de nuevo en un archivo;
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();
}
}
El código anterior funciona si la matriz de bytes recibido proviene de un cliente programado con Java, pero para C# clientes el código pende de un do-while en el BytesRead = input.read método (...).
¿Alguien sabe por qué el código está colgado en este punto para un cliente C# pero no para un cliente Java? De acuerdo con la salida del mensaje de impresión, los datos son recibidos por InputStream y se leen una vez en la inicialización de la variable bytesRead, pero no durante el ciclo do-while.
Cualquier solución o sugerencia para superar este problema sería bienvenida.
Saludos,
Midavi.
Muéstrenos su código C#. ¿Te estás perdiendo un 'Flush()'? – dtb
Si filesize no es menor o igual que los datos enviados de manera efectiva, read() bloqueará. Nunca intentes adivinar el tamaño de los datos que vas a recibir, debes seguir leyendo hasta que la transmisión esté vacía. – Viruzzo