我想通过套接字从Android向服务器发送大文件,但服务器收到的文件不完整。
android上的代码:
Socket client = new Socket(ipStr, 4444);
OutputStream outputStream = client.getOutputStream();
FileInputStream fileInputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
byte[] buffer = new byte[512];
byte[] sendLen = getBytes(file.length(), true);
outputStream.write(sendLen);
outputStream.flush();
int count;
while ((count = fileInputStream.read(buffer)) > 0)
{
outputStream.write(buffer, 0, count);
}
outputStream.flush();
bufferedInputStream.close();
outputStream.close();
client.close();
服务器上的代码:
byte[] recvHead = new byte[8];
inStream.read(recvHead, 0, 8);
long recvLength = getLong(recvHead, false);
FileOutputStream file = new FileOutputStream(fileName, false);
byte[] buffer = new byte[8192];
int count = 0;
while (count < recvLength) {
int n = inStream.read(buffer);
if(n == -1)
break;
file.write(buffer, 0, n);
count += n;
}
但是服务器将在读取(缓冲区)中阻塞(文件android发送的大约是30M)。
这是奇怪的事情: 当我在发送文件时向文件添加输出时,服务器可以正常工作。
FileOutputStream file2 = new FileOutputStream("/sdcard/testfile" , false);
while ((count = fileInputStream.read(buffer)) >= 0)
{
outputStream.write(buffer, 0, count);
outputStream.flush();
file2.write(buffer, 0, count);
file2.flush();
}
任何人都可以帮我这个吗?谢谢!
答案 0 :(得分:1)
你不能假设你读那样的8个长度字节。您可以在长度数组中读取少至一个字节。我会使用DataInputStream.readLong()来编写它,并使用DataOutputStream.writeLong()来编写它。或者,当您在一个文件之后关闭时,完全删除长度字,只读到EOS。
其余代码看起来没问题。如果接收器在read()中阻塞,则数据仍然存在,并且发送方仍在发送。