如何解决 java.net.ConnectException:无法连接到 /10.0.2.2(端口 8080):连接失败:ETIMEDOUT(连接超时)

Posted

技术标签:

【中文标题】如何解决 java.net.ConnectException:无法连接到 /10.0.2.2(端口 8080):连接失败:ETIMEDOUT(连接超时)【英文标题】:how to resolve java.net.ConnectException: failed to connect to /10.0.2.2 (port 8080): connect failed: ETIMEDOUT (Connection timed out) 【发布时间】:2012-05-31 19:11:13 【问题描述】:

我正在制作一个应用程序,它应该将文件从 sd 卡上传到 php 服务器以进行进一步处理,但是当我尝试上传我的 logcat 时显示以下错误:java.net.ConnectException: failed to connect to /10.0.2.2 (port 8080):连接失败:ETIMEDOUT(连接超时)。我的java代码如下。

package de.smsbackup;

import android.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.util.Log;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import de.smsbackup.SMSList;

@SuppressWarnings("unused")
public class Uploader extends Activity 

private String Tag = "UPLOADER";
private String urlString = "http://10.0.2.2:8080/admin/admin/uploadtest.php";
HttpURLConnection conn;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.upload_sms_file);

    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
    .detectDiskReads()  
    .detectDiskWrites()  
    .detectNetwork()   // or .detectAll() for all detectable problems  
    .penaltyLog()  
    .build());  
   StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
    .detectLeakedSqlLiteObjects()  
    .detectLeakedClosableObjects()  
    .penaltyLog()  
    .penaltyDeath()  
    .build()); 
    String exsistingFileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/SMSBackup.txt";

    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    try 
        // ------------------ CLIENT REQUEST

        Log.e(Tag, "Inside second Method");

        FileInputStream fileInputStream = new FileInputStream(new File(
                exsistingFileName));

        // open a URL connection to the Servlet

        URL url = new URL(urlString);

        // Open a HTTP connection to the URL

        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="
                        + exsistingFileName + "" + lineEnd);
        dos.writeBytes(lineEnd);

        Log.e(Tag, "Headers are written");

        // 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
        Log.e(Tag, "File is written");
        fileInputStream.close();
        dos.flush();
        dos.close();

     catch (MalformedURLException ex) 
        Log.e(Tag, "error: " + ex.getMessage(), ex);
    

    catch (IOException ioe) 
        Log.e(Tag, "error: " + ioe.getMessage(), ioe);
    


    try 
        BufferedReader rd = new BufferedReader(new InputStreamReader(conn
                .getInputStream()));
        String line;
        while ((line = rd.readLine()) != null) 
            Log.e("Dialoge Box", "Message: " + line);
        
        rd.close();

     catch (IOException ioex) 
        Log.e("Note Pad", "error: " + ioex.getMessage(), ioex);
    


我的 PHP 文件如下:

<?php
// Where the file is going to be placed 
 $target_path = "admin/";

 /* Add the original filename to our target path.  
  Result is "uploads/filename.extension" */
 $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

 if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) 
  echo "The file ".  basename( $_FILES['uploadedfile']['name']). 
  " has been uploaded";
  chmod ("uploads/".basename( $_FILES['uploadedfile']['name']), 0644);
 else
 echo "There was an error uploading the file, please try again!";
 echo "filename: " .  basename( $_FILES['uploadedfile']['name']);
 echo "target_path: " .$target_path;

?>

请任何人尽快告诉我我错在哪里?谢谢。

【问题讨论】:

您确定可以从应用程序访问 PHP 服务器吗? ETIMEDOUT 意味着在 5(?) 次重试后无法建立连接。尝试 ping 目标主机,并确保目标网络服务器也侦听端口 8080。 10.0.2.2 听起来像是一个内部 IP 地址。您的设备是否在同一个网络上,例如通过 Wi-Fi 而不是蜂窝网络连接? 我正在使用带有 Eclipse 的模拟器。当我尝试在我的机器上 ping 10.0.2.2 时,它给了我请求超时错误。那么在模拟器的情况下我应该做什么或应该使用什么来代替 10.0.2.2? 【参考方案1】:

我认为这是因为您处理 IP。尝试使用域名。

【讨论】:

以上是关于如何解决 java.net.ConnectException:无法连接到 /10.0.2.2(端口 8080):连接失败:ETIMEDOUT(连接超时)的主要内容,如果未能解决你的问题,请参考以下文章

如何解决包冲突问题

如何解决包冲突问题

如何解决ajax跨域问题

MySQL 的 10048问题,如何解决?

如何解决smartgit的冲突问题

如何解决https传输图片的问题