0
回答
java Socket下载文件出错
开发十年,就只剩下这套Java开发体系了   
public File getFile(boolean ever, String fileName,
            FileProgressListener listener) {
        File f = null;
        Socket socket = null;
        final BufferedReader reader;
        final InputStream inReader;
        final PrintWriter writer;
        final OutputStream fileOutput;
        try {

            Log.e(TAG, fileName);
            f = new File(filePath, fileName);
            Log.e(TAG, f.getAbsolutePath());
            if (f.exists()) {
                if (listener != null) {
                    listener.onFileProgressUpdate(fileName, fileName, 100);
                }
                return f;
            }
            f = new File(cachePath, fileName);
            Log.e(TAG, f.getAbsolutePath());
            if (f.exists()) {
                if (listener != null) {
                    listener.onFileProgressUpdate(fileName, fileName, 100);
                }
                return f;
            }
            if (ever) {
                f = new File(filePath, fileName);
            }
            f.createNewFile();

            socket = new Socket(HOST, 8888);
            inReader = socket.getInputStream();
            reader = new BufferedReader(new InputStreamReader(inReader));
            fileOutput = socket.getOutputStream();
            writer = new PrintWriter(fileOutput);
            JSONObject request = new JSONObject();
            request.put("operation", "get");
            request.put("file", fileName);
            writer.write(request.toString());
            writer.flush();
            // /////////////////new //////////////
            // /{"size" : long} -1表示文件不存在
            String re = reader.readLine();
            Log.e(TAG, "服务器返回的文件size:" + re);
            JSONObject result = new JSONObject(re);
            if (result.getLong("size") == -1) {
                socket.close();
                if (listener != null) {
                    listener.onFileProgressUpdate(f.getName(),null , -1);
                    throw new Exception("服务器无文件");
                }
            }

            // ///////////////////////////////////

            FileOutputStream fos;
            fos = new FileOutputStream(f.getAbsolutePath());

            long length = result.getLong("size");
            System.out.println("需要接收:" + length);

            byte[] cache = new byte[1024];
            int n = inReader.read(cache);
            long getSize = 0;
            int i = 0;
            long lastSize = 0;
            while (i < 40) {
                if (n > 0) {
                    getSize += n;
                    fos.write(cache, 0, n);
                    fos.flush();
                }
                if (getSize > lastSize) {
                    lastSize = getSize;
                    i = 0;
                } else {
                    i++;
                    Thread.sleep(300);
                }
                if (getSize >= length)
                    break;

                n = inReader.read(cache);
                System.out.println("已接收:" + getSize);
                if (listener != null) {
                    listener.onFileProgressUpdate(f.getName(), f.getName(),
                            (int) (getSize * 100 / length));
                }
            }
            
            

            System.out.println(getSize == length ? "接收完成" + length
                    : "接收文件错误, 内容残缺");
            if (getSize != length) {
                throw new Exception(getSize >= length ? "接收完成" + length
                        : "接收文件错误, 内容残缺");
            }
            if (listener != null) {
                listener.onFileProgressUpdate(f.getName(), f.getName(), 100);
            }
            fos.close();
            socket.close();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            if (listener != null) {
                listener.onFileProgressUpdate(f.getName(), f.getName(), -1);
            }
            f.delete();
            f = null;
        } finally {
            try {
                socket.close();
            } catch (Exception e) {
            }
        }
        return f;
    }



有问题先上代码.

代码很简单, 就是socket下载文件, 我把思路描述下.

代码就是常规的socket下载文件, 不过在下载文件前先获取一段json字符串, 表示要获取文件的size, 然后在获取文件时判断size, 验证是否下载完成. 里面的listener只是文件进度的监听.

现在问题来了. 这段代码是在android内运行, 在网络状况好时, 代码执行正常.网络稍微有点不流畅时,

inReader.read(cache);
 一直返回-1, 表示读到流末尾. 因为有size判断, 所以肯定文件还没收完. 问题就是, 我休眠后它还是一直-1, 服务器肯定在发, socket肯定也没关闭, 可就是返回-1.  一旦返回-1后就没法继续读文件了. 求各位看看

举报
岚风暴
发帖于4年前 0回/164阅
顶部