java - (Android) 从 Socket Outputstream.write() 获取上传进度?

标签 java android sockets progressdialog file-transfer

我正在制作一个 Android 应用程序,用于将文件从设备传输到计算机上的 Java 应用程序。它的工作原理是它可以将文件发送到计算机,但在发送时它有一个 ProgressDialog。该对话框不是用于监控从 SD 卡读取的进度,而是监控上传到服务器的进度。到目前为止,我的搜索仅涉及从 SD 卡或网页读取。

为了上传,我使用了一个简单的 OutputStream,它是通过 socket.getOutputStream(); 创建的。我的代码如下:

protected void onProgressUpdate(Integer... values) {
    mProgressDialog.setIndeterminate(false);
    mProgressDialog.setProgress(progress);
}

@Override
protected String doInBackground(String[] params) {
    String IP = params[1];
    File myFile = new File(params[0]);
    int count;
    try {
        long total = 0;
        Socket socket = new Socket(IP, 25000);
        byte[] buffer = new byte[(int) myFile.length()];
        FileInputStream fis = new FileInputStream(myFile);
        BufferedInputStream in = new BufferedInputStream(fis);
        OutputStream out = socket.getOutputStream(); // THIS IS MY OUTPUTSTREAM
        while((count = in.read(buffer, 0, buffer.length)) != -1) {
            total += count;
            progress = (int) (count);
            publishProgress();
            out.write(buffer, 0, buffer.length);
            Log.i("TOTAL", Long.toString(total));
            Log.i("Upload progress", "" + (int) ((total * 100) / buffer.length));
        }
        out.flush();
        out.close();
        in.close();
        socket.close();
    } catch(Exception ex) {
        ex.printStackTrace();
        Log.i("TAG", "Failed to send file");
    }
    return "test";
}

根据我对文档和其他论坛的研究,OutputStream 似乎没有返回任何内容的方法。这很麻烦,因为我需要在上传时返回其当前状态。

截至目前,无论文件大小如何,进度对话框都会立即从 0 变为最大(实际执行此操作需要更长的时间)。我不知道是什么原因造成的,但这不是重点。

如何使用 OutputStream 监控文件的上传进度?这可以做到吗?

提前致谢。

最佳答案

您的问题是您使用文件大小创建了缓冲区:

byte[] buffer = new byte[(int) myFile.length()];

因此您只循环传递 1 次,因为数据空间足够

while((count = in.read(buffer, 0, buffer.length)) != -1)

您需要进行如下更改:

byte[] buffer = new byte[256];

关于java - (Android) 从 Socket Outputstream.write() 获取上传进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45357275/

相关文章:

java - 在 Android 中选择 Spinner 项目时如何更新 TextView?

java - 从二进制文件中读取字符串不会返回任何内容

Java:在套接字编程中从InputStream接收不同类型的文件

php - 在 PHP 问题中通过套接字写入然后读回

java - 如何等待JDO中的事务结束?

java - 用于实现 Trie 的最佳开源内存 Java 应用程序

android - 使用 Android API 中未列出的 java 包

java - Stopself() 究竟做了什么?终止服务运行的最佳方式是什么?

java - 将参数从 MainActivity.java 传递到我的 SQLiteOpenHelper 类中

sockets - SOCKS和socket有什么关系?