3

這是一個簡單的helloworld項目,它使用從MyBeanMyEndpoint類別生成的端點,這些類別是Endpoints module的默認端點。我使用的仿真器是Genymotion,我通過ip連接到/10.0.2.2。當我訪問終端服務器在本地「本地主機:8080」在我的網頁瀏覽器,它工作得很好,但是當我在運行使用模擬器它/調試AndroidStudio我得到這個超時異常:無法連接到來自Genymotion仿真器的本地gae端點

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

模塊:應用的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') 
} 

模塊:後端的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 
    } 
} 

回答

6

10.0.2.2是指您的Genymotion仿真器設備,它不是您的開發應用引擎服務器正在運行的位置。 您的開發應用程序引擎服務器應該在您的本地臺式機上運行,​​並使用典型的IP地址(如192.168.1.100)。所以這樣做,而不是:

.setRootUrl( 「http://192.168.1.100:8080/_ah/api/」)

找出從在cmd.exe窗口 'IPCONFIG' 命令窗口您的IP地址。我不知道其他操作系統。注意,你將在本地使用'http',而不是'https'(用於訪問appspot.com上的應用程序引擎)

所有其他代碼看起來都是正確的!

+0

我想當你嘗試引用你的本地主機時,你應該將模擬器指向10.0.2.2。我會在一個小時內切換它,看看它是否有效。謝謝 ! – serj 2015-03-10 10:35:26

+0

http vs https問題工作,感謝您的注意。 – serj 2015-03-12 12:46:46

+0

獲取本地ip,可以使用「ifconfig」命令進行ubuntu – 2015-10-15 21:16:29

相關問題