Przenoszę plik z klienta C# do serwera Java za pomocą gniazd TCP. Na kliencie C# konwertuję plik na tablicę bajtów w celu przesłania i wysyłam go za pomocą NetworkStream.Odczytywanie tablicy bajtów C# w Javie
Na serwerze Java używam następującego kodu do konwersji odebranej tablicy bajtów z powrotem do pliku;
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();
}
}
Powyższy kod działa, jeśli odebrany bajt array pochodzi od klienta zaprogramowanego z Java, ale dla klientów C# kod wisi w do-while metoda pętla na bytesRead = input.read (...).
Czy ktoś wie, dlaczego kod jest zawieszony w tym momencie dla klienta C#, ale nie dla klienta Java? Zgodnie z danymi wyjściowymi z komunikatu println dane są odbierane przez InputStream i są odczytywane raz podczas inicjalizacji zmiennej bytesRead, ale nie podczas pętli do-while.
Wszelkie rozwiązania lub sugestie dotyczące rozwiązania tego problemu byłyby mile widziane.
Pozdrawiam,
Midavi.
Pokaż nam swój kod C#. Czy może brakuje Ci 'Flush()'? – dtb
Jeśli rozmiar pliku nie jest mniejszy lub równy skutecznie przesyłanym danym, funkcja read() zostanie zablokowana. Nigdy nie powinieneś próbować odgadnąć rozmiaru danych, które otrzymasz, musisz czytać, dopóki strumień nie będzie pusty. – Viruzzo