Tôi đang chuyển một tệp từ máy khách C# sang máy chủ Java bằng cách sử dụng TCP Sockets. Trên máy khách C# tôi chuyển đổi tệp thành mảng byte để truyền và gửi nó bằng cách sử dụng NetworkStream.Đọc một mảng C# byte trong Java
Trên máy chủ Java, tôi sử dụng mã sau để chuyển đổi mảng byte đã nhận trở lại thành tệp;
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();
}
}
Đoạn mã trên hoạt động nếu mảng byte nhận được xuất phát từ một khách hàng được lập trình với Java nhưng đối với C# khách hàng mã treo trong do-while loop tại bytesRead = input.read phương pháp (...).
Có ai biết tại sao mã được treo tại thời điểm này cho một khách hàng C# nhưng không phải là một khách hàng Java? Theo đầu ra từ dữ liệu tin nhắn println là chắc chắn được nhận bởi InputStream và được đọc một lần tại khởi tạo biến bytesRead, nhưng không phải trong vòng lặp do-while.
Bất kỳ giải pháp hoặc đề xuất nào để khắc phục sự cố này đều được hoan nghênh.
Trân trọng,
Midavi.
Hiển thị cho chúng tôi mã C# của bạn. Bạn có lẽ thiếu một 'Flush()'? – dtb
Nếu các tập tin không nhỏ hơn hoặc bằng dữ liệu được gửi một cách hiệu quả, hãy đọc() sẽ chặn. Bạn không bao giờ nên thử đoán kích thước của dữ liệu bạn sẽ nhận được, bạn phải tiếp tục đọc cho đến khi luồng trống. – Viruzzo