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

时间:2015-03-03 12:03:39

标签: java android google-app-engine 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)

客户端模块: 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...
}

运行它的实际代码: 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();

后端模块: MyBean.java

public class MyBean {

    private String myData;

    public String getData() {
        return myData;
    }

    public void setData(String data) {
        myData = data;
    }
}

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;
    }

模块: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')
}

模块:backend 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
    }
}

1 个答案:

答案 0 :(得分: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上的应用引擎)

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