Получение тайм-аута сокет соединения с локальным хостом Android

Я создал один API в локальном хосте с помощью PHP. Это, как я тестирую в почтальоне, он работает хорошо, но когда я звоню в URL с 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

Другие решения

Если вы пытаетесь подключиться через эмулятор Android, вы должны использовать 10.0.2.2 ip.

Через genymotion — 10.0.3.2.

Если вы используете аппаратное устройство с мобильным интернетом, вы должны знать IP своего ПК в интернете, например, используйте: https://2ip.ru/

Если вы используете Wi-Fi, проверьте ip вашего компьютера в сети с помощью команды ipconfig на консоли.

Для соединения с сокетом вы также должны знать порт, который использовал ваш сервер

0

По вопросам рекламы [email protected]