无法从Genymotion模拟器连接到本地gae端点

ser*_*erj 3 java google-app-engine android google-cloud-endpoints google-cloud-platform

这是一个简单的helloworld项目,它使用从MyBeanMyEndpoint默认生成的类生成的端点Endpoints module.我使用的模拟器是Genymotion,我通过/10.0.2.2 ip 连接到它.当我在我的网络浏览器中本地访问端点服务器"localhost:8080"时它工作得很好但是当我在AndroidStudio中使用模拟器运行/调试它时,我得到了这个超时异常:

-3571/com.serjsmor.anotherbackend W/System.err? java.net.SocketTimeoutException: failed to connect to /10.0.2.2 (port 8080) after 20000ms
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at libcore.io.IoBridge.connectErrno(IoBridge.java:169)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at libcore.io.IoBridge.connect(IoBridge.java:122)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at java.net.Socket.connect(Socket.java:882)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.android.okhttp.internal.Platform.connectSocket(Platform.java:139)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.android.okhttp.Connection.connect(Connection.java:148)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:208)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:25)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:77)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:965)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at com.serjsmor.anotherbackend.MainActivity$1.run(MainActivity.java:25)
    03-03 11:44:30.310    3548-3571/com.serjsmor.anotherbackend W/System.err? at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud)

客户端模块: TestEndpoint.java

public class TestEndpoint {

    final MyApi taskApiService;

    // Constructor
    public TestEndpoint () {
        MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(),
                new AndroidJsonFactory(), null)
                .setRootUrl("https://10.0.2.2:8080/_ah/api/")
                .setGoogleClientRequestInitializer( new GoogleClientRequestInitializer() {
                    @Override
                    public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest)
                            throws IOException {
                        abstractGoogleClientRequest.setDisableGZipContent(true);
                    }
                }

                );
        taskApiService = builder.build();
    } // end of constructor, other methods to follow in this class...
}
Run Code Online (Sandbox Code Playgroud)

运行它的实际代码:MainActivity.java

new Thread( new Runnable() {
            @Override
            public void run() {
                TestEndpoint test = new TestEndpoint();
                try {
                    test.taskApiService.sayHi("sdad").execute();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
Run Code Online (Sandbox Code Playgroud)

后端模块: MyBean.java

public class MyBean {

    private String myData;

    public String getData() {
        return myData;
    }

    public void setData(String data) {
        myData = data;
    }
}
Run Code Online (Sandbox Code Playgroud)

MyEndpoint.java

@Api(name = "myApi", version = "v1", namespace = @ApiNamespace(ownerDomain = "backend.anotherbackend.serjsmor.com", ownerName = "backend.anotherbackend.serjsmor.com", packagePath = ""))
public class MyEndpoint {

    /**
     * A simple endpoint method that takes a name and says Hi back
     */
    @ApiMethod(name = "sayHi")
    public MyBean sayHi(@Named("name") String name) {

        MyBean response = new MyBean();
        response.setData("Hi, " + name);

        return response;
    }
Run Code Online (Sandbox Code Playgroud)

模块:app build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.serjsmor.anotherbackend"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile project(path: ':backend', configuration: 'android-endpoints')
}
Run Code Online (Sandbox Code Playgroud)

模块:后端build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.google.appengine:gradle-appengine-plugin:1.9.14'
    }
}

repositories {
    jcenter();
}

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'appengine'

sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7

dependencies {
    appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.14'
    compile 'com.google.appengine:appengine-endpoints:1.9.14'
    compile 'com.google.appengine:appengine-endpoints-deps:1.9.14'
    compile 'javax.servlet:servlet-api:2.5'
}

appengine {
    downloadSdk = true
    appcfg {
        oauth2 = true
    }
    endpoints {
        getClientLibsOnBuild = true
        getDiscoveryDocsOnBuild = true
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

10.0.2.2指的是您的Genymotion仿真器设备,它不是您的dev app引擎服务器正在运行的地方.您的dev应用引擎服务器应该在本地台式计算机上运行,​​其典型IP地址如192.168.1.100.所以这样做:

.setRootUrl(" http://192.168.1.100:8080/_ah/api/ ")

在cmd.exe窗口中使用'ipconfig'命令从Windows中找到您的IP地址.我不知道其他操作系统.请注意,您将在本地使用"http",而不是"https"(用于访问appspot.com上的应用引擎)

你所有的其他代码似乎都是正确的!