2017-12-23 14 views
0

私は、ローカルホストでphpを使用して1つのAPIを作成しました。これは私がpostmanでうまく動作しているかどうかをテストしますが、アンドロイドからurlを呼び出してソケット接続タイムアウトの例外を出しています。localhostでソケット接続のタイムアウトを取得するandroid

そのamppsサーバー、接続できません。

これは私のPHPスクリプトです:

<?php 

//echo error 
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); 
ini_set('display_errors', '1'); 

// require database 
require 'database.php'; 

//get file input 
$jsonText = file_get_contents('php://input'); 

//check params in file 
if (empty($jsonText)) { 
    $response = array("status" => -1, "message" => "Empty request"); 
    die(json_encode($response)); 
} 

try{ 

//decode params in json 
$json = json_decode($jsonText); 
$mobile_no = $json->mobile_no; 
$device_id = $json->device_id; 

//init database connection 
$database = new Database(Constants::DBHOST, Constants::DBUSER, Constants::DBPASS, Constants::DBNAME); 
$dbConnection = $database->getDB(); 

//query to insert device 

$statement = $dbConnection->prepare("INSERT INTO data(mobile_number, device_id) 
    VALUES(:mobile_no, :device_id)"); 
$statement->execute(array(
    "mobile_no" => $mobile_no, 
    "device_id" => $device_id 
)); 
    $newId = $dbConnection->lastInsertId(); 

    if($newId != null) 
    { 
     $response = array("status" => 1, "message" => "Success"); 
     die(json_encode($response)); 
    } 
} 
catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

定数:

<?php 

class Constants 
{ 
    const DBNAME = 'UserDevices'; 
    const DBUSER = 'fsdfsf'; 
    const DBPASS = 'fsdfsdfs'; 
    const DBHOST = '192.168.44.1'; 
} 

?> 

データベース

<?php 
require 'constants.php'; 

class Database 
{ 

    private $dbhost; 
    private $dbuser; 
    private $dbpass; 
    private $dbname; 


    function Database($dbhost, $dbuser, $dbpass, $dbname) 
    { 
     $this->dbhost = $dbhost; 
     $this->dbuser = $dbuser; 
     $this->dbpass = $dbpass; 
     $this->dbname = $dbname; 

    } 

    function getDB() 
    { 

     $mysql_conn_string = "mysql:host=$this->dbhost;dbname=$this->dbname;charset=utf8"; 

     try { 
      $dbConnection = new PDO($mysql_conn_string, $this->dbuser, $this->dbpass); 
      $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } catch (PDOException $ex) { 

      echo($ex->getMessage()); 
     } 

     return $dbConnection; 
    } 
} 

?> 

アンドロイド

String token = tokenPreference.getString("token",""); 

    if(!token.equals("")) { 
     //String cno=preferences.getString("cono",null); 
     String[] keys = new String[] {"mobile_no", "device_id"}; 
     String[] values = new String[] {preferences.getString(Const.DRIVER_MOBILE_NUMBER,""), token}; 

     final String jsonRequest = SecondUtils.createJsonRequest(keys, values); 

     String URL = "http://192.168.44.1/fuelOneTest/insertDevice.php"; 



     new WebserviceCall(MainDriver.this, URL, jsonRequest, "Loading", true, new AsyncResponse() { 
      @Override 
      public void onCallback(String response) { 
       Log.d("myapp", response); 

       //  Toast.makeText(RegisterDriver.this, model.getResponse_desc(), Toast.LENGTH_SHORT).show(); 

       try { 
        JSONObject jsonObject = new JSONObject(response); 

        // change below condition to 0.. for testing it change to 1 
        if (jsonObject.get("message").equals("Success")) { 

         Log.d("DeviceToken", "Device token inserted."); 

        } else { 

        } 
       }catch (JSONException je) 
       { 
        je.printStackTrace(); 
       } 
      } 
     }).execute(); 
    } 

public class WebserviceCall extends AsyncTask<Void,Void,String> { 
// interface for response 

AsyncResponse delegate; 
private final MediaType URLENCODE = MediaType.parse("application/json;charset=utf-8"); 
ProgressDialog dialog; 
Context context; 
String dialogMessage; 
boolean showDialog = true; 
String URL; 
String jsonBody; 

public WebserviceCall(Context context, String URL, String jsonRequestBody, String dialogMessage, boolean showDialog, AsyncResponse delegate){ 
    this.context = context; 
    this.URL = URL; 
    this.jsonBody = jsonRequestBody; 
    this.dialogMessage = dialogMessage; 
    this.showDialog = showDialog; 
    this.delegate = delegate; 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 

    if(Utils.isNetworkAvailable(context)) { 


     if (showDialog) { 
      dialog = new ProgressDialog(context); 
      dialog.setMessage(dialogMessage); 
      dialog.show(); 
     } 
    } 

     else { 

      Utils.showDialog(context, context.getString(R.string.networkWarning)); 

     } 

} 


@Override 
protected String doInBackground(Void... params) { 

    // creating okhttp client 
    OkHttpClient client = new OkHttpClient(); 

    // client.setConnectTimeout(10L, TimeUnit.SECONDS); 
    // creating request body 
    RequestBody body; 
    if(jsonBody != null) { 
     body = RequestBody.create(URLENCODE, jsonBody); 
    }else{ 
     body = null; 
    }; 

     // creating request 
     Request request = new Request.Builder() 
       .post(body) 
       .url(URL) 
       .build(); 

     // creating webserivce call and get response 

     try { 
      Response response = client.newCall(request).execute(); 
      String res = response.body().string(); 
      Log.d("myapp", res); 
      return res; 

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


    return null; 
} 


@Override 
protected void onPostExecute(String s) { 
    super.onPostExecute(s); 
    if(dialog != null && showDialog){ 
     if(dialog.isShowing()){ 
      dialog.dismiss(); 
     } 
    } 
    if(s != null){ 

     delegate.onCallback(s); 
    }else{ 
     Log.d("myapp",getClass().getSimpleName()+": response null"); 
    } 
} 

}

どうしてですか?誰でも私にこれを助けてくれますか?

答えて

0

あなたはAndroid搭載端末でスクリプトを実行していませんか?

この回答はおそらくではなく、です。つまり、localhost(または127.0.0.1)にはありません。実際にスクリプトを持っているデバイスの内部IP(192.168.x.x)を探し、その代わりに接続します。

ソケットタイムアウトは、何もないのでAndroidデバイスに接続できないためです。

+0

を使用するポートを知っている必要がありますはい、私は私のデバイス上のTESTINが、私はそう無線LAN – Sid

+0

@Sidを使用して、デバイス上のデスクトップと同じネットのプロバイダを使用していますか? ? Localhostは**デバイスそのものです**。そのため、内部IPが必要です。内部IPは、あるルータに接続したときの位置であり、そのIPは常に「192.168.x.x」です。内部IPが192.168.1.101であると言えば、別のネットワークに接続しているため、そのIPに接続できません。デバイスが異なるネットワークに接続されている場合は、外部IP(ローカルホストと内部IPを除く0〜255の任意の数)が必要です。スクリプトが同じデバイスになければ、localhostに接続できません – Zoe

+0

[this](https://superuser.com/questions/321734/how-does-localhost-127-0-0-1-ローカルホストの仕組みに関連する) – Zoe

0

アンドロイドエミュレータ経由で接続しようとすると、10.0.2.2 ipを使用する必要があります。

Via genymotion - 10.0.3.2。

あなたがモバイルインターネットでハードウェアデバイスを使用する場合は、例えば、使用するため、インターネットにあなたのPCのIPアドレスを知っている必要があります:https://2ip.ru/

あなたがで「IPCONFIG」コマンドを使用して、あなたのネットにあなたのPCをIPのWi-Fiチェックを使用している場合コンソール

は、ソケットとの接続のために、あなたはまた、あなたのサーバが

関連する問題