Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android客户端使用套接字发送大文件,服务器接收的文件不完整_Android_Sockets_Streamwriter - Fatal编程技术网

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

Android客户端使用套接字发送大文件,服务器接收的文件不完整,android,sockets,streamwriter,Android,Sockets,Streamwriter,我想通过套接字从Android向服务器发送一个大文件,但服务器收到的文件不完整 android上的代码: Socket client = new Socket(ipStr, 4444); OutputStream outputStream = client.getOutputStream(); FileInputStream fileInputStream = new FileInputStream(file); BufferedInputStream bufferedInputStr

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

有人能帮我吗?谢谢大家!

您不能假设您读取的是8个长度的字节。您可以在长度数组中读取一个字节。我将使用DataInputStream.readLong()来实现这一点,并使用DataOutputStream.writeLong()来编写它。或者,当您在一个文件后关闭时,完全去掉长度字,只需一直读到EOS


代码的其余部分看起来还可以。如果接收器在read()中阻塞,则数据仍在发送,而发送者仍在发送。

实际上,我使用此代码来确保服务器接收到8个长度的字节<代码>int len=流内读取(recvHead,0,8);int pos=len;而(len>=0&&pos<8){len=inStream.read(recvHead,pos,8-pos);pos+=len;}问题是服务器可以接收正确的文件长度,但文件内容不完整。谢谢@user1656092,所以它还没有全部发送,正如您所说的,接收器仍然在read()中被阻塞。
 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();

 }