如何解决 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(连接超时)的主要内容,如果未能解决你的问题,请参考以下文章