0

我想让用户使用他计算机上的网络浏览器(在本地网络中)从我的 android 应用程序下载文件。起初我在我的电脑上用 eclipse 编写了这个功能的代码,它运行良好。但是当我尝试在 android 应用程序中运行它时(该文件是从资产路径复制的),我无法再下载该文件了。Firefox 只是告诉我它无法下载,因为无法读取源文件。

这是我在应用程序中的代码。它不会抛出任何错误。

public class test implements Runnable {

public boolean running = true;
ServerSocket servsock = null;
Context context;
String filename = "test.jar";

public test(Context con){
    this.context=con;
}

public Integer createSocketandStart(){
    for (int i=1234; i<2000; ++i){
        try{
            servsock = new ServerSocket(i);
            servsock.setSoTimeout(1000000);
            new Thread(this).start();
            return i;
        }catch(Exception e){
            System.out.print("socket error");
        }
    }
    return null;
}

public void run(){

    File f= new File(context.getFilesDir(), filename);
    try {

        InputStream is = context.getAssets().open(filename);
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();

        FileOutputStream fos = new FileOutputStream(f);
        fos.write(buffer);
        fos.close();

    } catch (Exception e) { throw new RuntimeException(e); }

    while (running) {

        try {
            Socket connection = servsock.accept();
            OutputStream out = new BufferedOutputStream(connection.getOutputStream());
            PrintStream pout = new PrintStream(out);
            InputStream file = new FileInputStream(f);

            pout.print("HTTP/1.0 200 OK\r\n" +
                    "Content-Type: application/octet-stream\r\n" +
                    "Content-Disposition: attachment; filename=\"" + filename + "\"\r\n" +
                    "Date: " + new Date() + "\r\n" +
                    "Server: FileServer 1.0\r\n\r\n");


            byte[] buffer = new byte[1000];
            while (file.available() > 0) {
                out.write(buffer, 0, file.read(buffer));
            }

            out.flush();

            if (connection != null) connection.close();

            file.close();
            pout.close();
            out.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

}

4

0 回答 0