0

Stackoverflow にも同様の質問があることは知っていますが、私の問題は解決しませんでした。Android からローカルの Apache サーバーにファイルをアップロードしたいのですが、「接続が拒否されました」というエラーが発生します。

Mac OS X Lion (ポート 80 の Apache) で Android 3.2 と MAMP を搭載した物理デバイスを使用しています。マニフェストに INTERNET アクセス許可も追加しました。

コードは次のとおりです。

    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";

    FileInputStream fileInputStream = null;
    try {
        fileInputStream = new FileInputStream(new File(
                "/mnt/sdcard/somefile.xml"));
    } catch (FileNotFoundException e) {
        ...
    }

    URL url = null;
    try {
        url = new URL("http://192.168.x.xxx:80/index.php");
    } catch (MalformedURLException e) {
        ...
    }

    try {
        // Open a HTTP connection to the URL
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        // Allow Inputs
        conn.setDoInput(true);
        // Allow Outputs
        conn.setDoOutput(true);

        // Don't use a cached copy.
        conn.setUseCaches(false);

        // Use a post method.
        conn.setRequestMethod("POST");

        conn.setRequestProperty("Connection", "Keep-Alive");

        conn.setRequestProperty("Content-Type",
                "multipart/form-data;boundary=" + boundary);

        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

        dos.writeBytes(twoHyphens + boundary + lineEnd);
        dos.writeBytes("Content-Disposition: post-data; name=uploadedfile;filename="
                + SOMEFILE + "" + lineEnd);
        dos.writeBytes(lineEnd);

        // create a buffer of maximum size
        int bytesAvailable = fileInputStream.available();
        int maxBufferSize = 1000;
        // int bufferSize = Math.min(bytesAvailable, maxBufferSize);
        byte[] buffer = new byte[bytesAvailable];

        // read file and write it into form...
        int bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);

        while (bytesRead > 0) {
            dos.write(buffer, 0, bytesAvailable);
            bytesAvailable = fileInputStream.available();
            bytesAvailable = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);
        }

        // send multipart form data necesssary after file data...
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        // close streams
        fileInputStream.close();
        dos.flush();
        dos.close();
    } catch (IOException e) {
        ...
    }

例外:

07-24 14:48:43.280: E/App(5802): failed to upload file '/mnt/sdcard/somefile.xml' to   
server 'http://192.168.x.xxx:80/index.php'
07-24 14:48:43.280: E/App(5802): java.net.ConnectException: /192.168.x.xxx:80 -   
Connection refused
4

2 に答える 2

1

コードは問題ないようです。エミュレータは問題なく接続できます。ルーターのファイアウォールに問題がありました

于 2012-07-25T07:13:53.093 に答える
1

Mac でファイアウォールを有効にして実行していますか?

ポート 80 が実際に開いているかどうかを判断する最善の方法 (IMHO) は、ローカル ネットワーク上の別のマシンでターゲット アドレスに対して NMap (または gui Zenmap) を実行することです。

デスクトップ マシンと Android デバイスだけの場合は、http://192.168.xxを参照して、Apache サーバーが応答しているかどうかを確認してください。

于 2012-07-24T14:54:51.017 に答える