簡體   English   中英

使用本地主機android獲取套接字連接超時

[英]Getting socket connection timeout with localhost android

我已經使用php在本地主機中創建了一個api。 正如我在郵遞員中測試的那樣,它運作良好,但是當我從android調用url時,套接字連接超時異常。

它的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");
    }
}

}

為什么會這樣呢? 有人可以幫我嗎?

您不在Android設備上運行腳本,是嗎?

答案很可能不是 意味着它不在localhost (或127.0.0.1 )上。 找到實際具有腳本的設備的內部IP( 192.168.xx ),然后連接到該IP。

套接字超時是因為無法連接到Android設備,因為那里什么也沒有。

如果您嘗試通過android仿真器進行連接,則必須使用10.0.2.2 ip。

通過genymotion-10.0.3.2。

如果您將硬件設備與移動互聯網一起使用,則必須了解互聯網中的PC ip,例如,使用: https : //2ip.ru/

如果使用wi-fi,請通過控制台上的“ ipconfig”命令在網絡中檢查ip電腦

要使用套接字連接,還必須知道服務器使用的端口

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM