我正在使用 TCP 套接字将文件从 C# 客户端传输到 Java 服务器。在 C# 客户端上,我将文件转换为字节数组以进行传输并使用 NetworkStream 发送它。
在 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# 客户端,代码会卡在 bytesRead = input.read(...) 方法的 do-while 循环中。
有谁知道为什么此时代码对于 C# 客户端而不是 Java 客户端挂起?根据 println 消息的输出,数据肯定由 InputStream 接收,并在 bytesRead 变量初始化时读取一次,但在 do-while 循环期间不会读取。
欢迎提出任何克服此问题的解决方案或建议。
问候,
米达维。
最佳答案
您需要从 C# 中将字节作为 sbyte
而不是 byte
发送。
此外,您应该将 do/while 循环更改为常规 while 循环。如果您在第一次调用 input.read
时已经读取了流中的所有内容,那么您将在第二次调用时阻塞,因为 read
将等待输入。
关于c# - 在 Java 中读取 C# 字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8913998/