【问题标题】:Android client send large file using Socket ,file received by server is incompleteAndroid客户端使用Socket发送大文件,服务器接收到的文件不完整
【发布时间】:2012-10-15 05:12:15
【问题描述】:

我想通过socket从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;                 
}   

但是服务器会阻塞在read(buffer)中(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();

 }

谁能帮我解决这个问题?谢谢!

【问题讨论】:

    标签: android sockets streamwriter


    【解决方案1】:

    您不能假设您像那样读取了 8 个长度字节。您可以只在长度数组中读取一个字节。我会为此使用 DataInputStream.readLong() ,并使用 DataOutputStream.writeLong() 来编写它。或者,当您在一个文件之后关闭时,完全摆脱长度字并一直阅读直到 EOS。

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

    【讨论】:

    • 实际上我使用此代码来确保服务器接收到 8 个长度字节。 int len = inStream.read(recvHead, 0, 8); int pos = len; while (len &gt;= 0 &amp;&amp; pos &lt; 8) { len = inStream.read(recvHead, pos, 8 - pos); pos += len; }
    • 问题是服务器可以接收正确的文件长度,但文件内容不完整。谢谢!
    • @user1656092 所以它还没有全部发送,正如你所说的接收者仍然在 read() 中被阻止。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多