web-dev-qa-db-ja.com

Retrofitはポート3000でローカルWebサーバーに接続できません

Retrofit(v1.6.1)を使用して接続するREST WebサービスはローカルWebサーバーに接続できません(localhostで実行)、これはエラーです取得。

これはNexus4(v4.3)エミュレーター内にあります。Android開発用スタジオを使用しており、Android.permission.INTERNETAndroid.permission.ACCESS_NETWORK_STATEマニフェストファイルの権限。

エラーには、15秒間待機していると表示されますが、そうではなく、すぐにエラーが表示されます。

07-13 15:57:53.947      820-840/it.test.Android.app.activity D/Retrofit﹕ ---> HTTP POST http://localhost:3000/app/auth/signin
07-13 15:57:54.132      820-840/it.test.Android.app.activity D/Retrofit﹕ Content-Type: application/json; charset=UTF-8
07-13 15:57:54.132      820-840/it.test.Android.app.activity D/Retrofit﹕ Content-Length: 44
07-13 15:57:54.157      820-840/it.test.Android.app.activity D/Retrofit﹕ {"auth":{"email":"steve","password":"pass"}}
07-13 15:57:54.387      820-840/it.test.Android.app.activity D/Retrofit﹕ ---> END HTTP (44-byte body)
07-13 15:57:54.657      820-840/it.test.Android.app.activity D/Retrofit﹕ ---- ERROR http://localhost:3000/app/auth/signin
07-13 15:57:54.857      820-840/it.test.Android.app.activity D/Retrofit﹕ Java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 3000) after 15000ms: isConnected failed: ECONNREFUSED (Connection refused)
            at libcore.io.IoBridge.isConnected(IoBridge.Java:223)
            at libcore.io.IoBridge.connectErrno(IoBridge.Java:161)
            at libcore.io.IoBridge.connect(IoBridge.Java:112)
            at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:192)
            at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:459)
            at Java.net.Socket.connect(Socket.Java:842)
            at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:76)
            at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:50)
            at libcore.net.http.HttpConnection$Address.connect(HttpConnection.Java:340)
            at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.Java:87)
            at libcore.net.http.HttpConnection.connect(HttpConnection.Java:128)
            at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.Java:316)
            at libcore.net.http.HttpEngine.connect(HttpEngine.Java:311)
            at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.Java:290)
            at libcore.net.http.HttpEngine.sendRequest(HttpEngine.Java:240)
            at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.Java:81)
            at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.Java:197)
            at retrofit.client.UrlConnectionClient.prepareRequest(UrlConnectionClient.Java:68)
            at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.Java:37)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.Java:321)
            at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.Java:220)
            at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.Java:278)
            at retrofit.CallbackRunnable.run(CallbackRunnable.Java:42)
            at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1080)
            at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:573)
            at retrofit.Platform$Android$2$1.run(Platform.Java:142)
            at Java.lang.Thread.run(Thread.Java:841)
     Caused by: libcore.io.ErrnoException: isConnected failed: ECONNREFUSED (Connection refused)
            at libcore.io.IoBridge.isConnected(IoBridge.Java:208)
            at libcore.io.IoBridge.connectErrno(IoBridge.Java:161)
            at libcore.io.IoBridge.connect(IoBridge.Java:112)
            at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:192)
            at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:459)
            at Java.net.Socket.connect(Socket.Java:842)
            at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:76)
            at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:50)
            at libcore.net.http.HttpConnection$Address.connect(HttpConnection.Java:340)
            at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.Java:87)
            at libcore.net.http.HttpConnection.connect(HttpConnection.Java:128)
            at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.Java:316)
            at libcore.net.http.HttpEngine.connect(HttpEngine.Java:311)
            at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.Java:290)
            at libcore.net.http.HttpEngine.sendRequest(HttpEngine.Java:240)
            at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.Java:81)
            at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.Java:197)
            at retrofit.client.UrlConnectionClient.prepareRequest(UrlConnectionClient.Java:68)
            at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.Java:37)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.Java:321)
            at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.Java:220)
            at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.Java:278)
            at retrofit.CallbackRunnable.run(CallbackRunnable.Java:42)
            at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1080)
            at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:573)
            at retrofit.Platform$Android$2$1.run(Platform.Java:142)
            at Java.lang.Thread.run(Thread.Java:841)
07-13 15:57:54.857      820-840/it.test.Android.app.activity D/Retrofit﹕ ---- END ERROR
25
kapso

この問題を解決しました。ローカルサーバーに接続するには、localhostの代わりに10.0.2.2を使用する必要があります。

ここで見つけました- http://developer.Android.com/tools/devices/emulator.html#networkaddresses

28
kapso

localhost:3000に接続する電話では、「ローカルネットワークインターフェイスのポート3000に接続」を意味します。これは、電話が接続されているPCのポート3000ではなく、電話のローカルインターフェイスです。電話機のポート3000でリッスンするものは何もないため、接続拒否エラーが発生します。

あなたがやろうとしているのは(おそらく、これ以上の情報なしでは推測するのが難しい)、電話からPCのポート3000に接続することです。そのため、接続先のアドレスをlocalhostからPCのアドレスに変更する必要があります。エミュレータの場合は、10.0.2.2(PCのローカルホスト)です。 ネットワーク情報を参照 参照用。

46
Mariusz Jamro