【发布时间】:2012-01-18 16:50:02
【问题描述】:
我正在使用 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# 代码。您是否错过了
Flush()? -
如果文件大小不小于或等于有效发送的数据,read() 将阻塞。您永远不要试图猜测您将要接收的数据的大小,您必须继续阅读,直到流为空。