Sto trasferendo un file da un client C# a un server Java tramite TCP Sockets. Nel client C# converto il file in un array di byte per la trasmissione e lo invio utilizzando un NetworkStream.Lettura di un array di byte C# in Java
Sul server Java utilizzo il seguente codice per convertire nuovamente l'array di byte ricevuto in un file;
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();
}
}
Il codice precedente funziona se l'array di byte ricevuto proviene da un client programmato con Java, ma per C# client il codice si blocca in do-while metodo anello nella parte bytesRead = input.read (...).
Qualcuno sa perché il codice è sospeso a questo punto per un client C# ma non un client Java? Secondo l'output dal messaggio println, i dati vengono definitivamente ricevuti da InputStream e letti una sola volta all'inizializzazione della variabile Bytes Read, ma non durante il ciclo do-while.
Qualsiasi soluzione o suggerimento per superare questo problema sarebbe il benvenuto.
Saluti,
Midavi.
Mostraci il tuo codice C#. Ti manca forse un 'Flush()'? – dtb
Se il file non è inferiore o uguale ai dati effettivamente inviati, read() si bloccherà. Non dovresti mai cercare di indovinare la dimensione dei dati che stai per ricevere, devi continuare a leggere finché lo stream non è vuoto. – Viruzzo