我正在使用TCP Socket将文件从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#客户端,代码会在do-while循环中的bytesRead = input.read(...)方法处挂起。
有人知道为什么代码在C#客户端这一点上挂起,而不是Java客户端?根据println消息的输出,数据明确被InputStream接收,并且在bytesRead变量初始化时读取了一次,但在do-while循环期间没有读取。
欢迎提出任何解决此问题的解决方案或建议。
敬礼,
Midavi。
Flush()
吗? - dtb