如何在android中的网络(套接字编程(TCP))中传输文件



我正在尝试将一些文件从服务器发送到android中的一些客户端。我通过bufferedInputStream by read(byte[]array,int startIndex,int arraySize)方法接收文件,该方法返回它可以读取的字节数,如果没有要读取的输入,则返回-1。我在循环中接收文件,当我的文件完成时,我必须退出循环,但读取方法不是返回-1,只是等待更多的输入读取:/所以我的代码被阻塞了。。。。我试图从服务器发送文件大小,并在收到它时,每次读取缓冲区时,从中减去number reads byte,所以当这个数字达到0时,意味着我收到了所有文件,应该打破循环,但在某些文件中,它不会达到0,就好像我的文件的某个部分没有发送一样:|但当我在服务器端做同样的事情时(从早期文件大小中减去发送的部分),它总是达到0。。。。所以我的问题是如何知道我读取了所有文件以打破读取循环:(类似问题我的问题与这个链接不同,因为我做了建议的答案,但在一些文件中剩余的文件大小没有达到0,我不知道为什么

这是我在服务器端发送文件的代码:

public void sendFile(File file){
        BufferedOutputStream bos = null;
        BufferedInputStream bis = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(file));
            bos = new BufferedOutputStream(outputStream);
            byte[] temp = new byte[2 * 1024];
            int length ;
            int fileSize=(int)file.length();
            Log.d("file size",Integer.toString(fileSize));
            //int sendSize =0;
            while (true){
                length = bis.read(temp,0,temp.length);
                if(length == -1) break;
                bos.write(temp,0,length);
                fileSize-=length;
                assert (fileSize >=0 );
                //if(fileSize==0)break;
            }
             // outputStream.write(-1);
            bos.flush();
            Log.d("File ", "Send finisheeed!");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                bis.close();
              //bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

这里是接收文件的客户端代码部分:

     Log.d("File name is", fileName);
               // File outFile = new File("/storage/sdcard0/m2app" + fileName);
                //    outFile.createNewFile();
                    bos = new BufferedOutputStream(new FileOutputStream("/storage/sdcard0/m2app" + fileName));
                    byte[] temp = new byte[2 * 1024];
                    int length = 0;
                    while (true)
                    {
                        length = bis.read(temp,0,temp.length);
                        fileLength -= length;
                       // Log.d("read",Integer.toString(fileLength) );
                        if(length == -1 || fileLength == 0 ) {
                      //  if(temp[length-1] == -1){
                      //      bos.write(temp,0,length-1);
                      //      bos.flush();
                      //      Log.d("file","recived!!!!!!!!!!");
                            break;
                        }
                        if(fileLength < 4000 && bis.available() == 0)
                            break;
                        bos.write(temp,0,length);
                        bos.flush();
                        /*if(fileLength == 0){
                            Log.d("file","0 shod");
                            break;
                        }*/
                    }
                    while (fileLength > 0 )
                        fileLength-=bis.skip(fileLength);
                  //  inputStream.reset();
                    bos.close();
                    Log.d("File " , "Receiving finisheeeeeeeeeddddd!!!");
                    isFile = false;

您需要关闭文件发送器中的输出流以获取EOF。

使用try with resources可以极大地简化代码:

public void sendFile(File file) {
    try(BufferedOutputStream bos = new BufferedOutputStream(outputStream);
        FileInputStream fis = new FileInputStream(file));
        BufferedInputStream bis = new BufferedInputStream(fis)) {
        byte[] temp = new byte[64 * 1024];
        int length ;
        int fileSize=(int)file.length();
        Log.d("file size",Integer.toString(fileSize));
        while ((bis.read(temp,0,temp.length) != -1){
            bos.write(temp,0,length);
        }
        Log.d("File ", "Send finished!");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

相关内容

  • 没有找到相关文章

最新更新