Android客户端使用Socket发送大文件,服务器收到的文件不完整

时间:2012-10-25 04:13:24

标签: android sockets streamwriter

我想通过套接字从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();

 }

任何人都可以帮我这个吗?谢谢!

1 个答案:

答案 0 :(得分:1)

你不能假设你读那样的8个长度字节。您可以在长度数组中读取少至一个字节。我会使用DataInputStream.readLong()来编写它,并使用DataOutputStream.writeLong()来编写它。或者,当您在一个文件之后关闭时,完全删除长度字,只读到EOS。

其余代码看起来没问题。如果接收器在read()中阻塞,则数据仍然存在,并且发送方仍在发送。

相关问题