2

を使用してサーバーと通信する Android クライアント アプリがありますSocket

私の開発マシンでは、SocketServer(サーバーも Java で書かれています) は127.0.1.1portでリッスンしています8666。また、Android アプリのアプリ マニフェストにインターネット アクセス許可を追加しました。

しかし、 を使用して Socket オブジェクトをインスタンス化しようとすると、メッセージclient = new Socket("127.0.1.1",8666)がスローIOExceptionされconnection refusedます (IP アドレスを手動で指定する代わりに使用も試みlocalhostましたが、うまくいきません)。シンプルなコンソールJavaプログラムからサーバーに簡単に接続できますが。

ここで何が問題なのですか?

アップデート

私の質問は、いくつかの点でこれに関連しています。エミュレーターが実行されているのと同じマシンで実行されているサーバーにアクセスしようとしています。

注: Activity クラスでネットワーク IO を実行することは推奨されていないことはわかっています。また、その方法も行っていません。上記のコードは、理解するために簡略化された問題です。

4

3 に答える 3

3

使ってみよう、ポートフォワーディング

adb の場所にあるコマンド プロンプトから、

adb forward tcp:8666 tcp:8666

任意のポート フォワーディング (特定のホスト ポートの要求をエミュレータ/デバイス インスタンスの別のポートに転送する) を設定するforwardコマンド。ホスト ポート 8666 からエミュレータ/デバイス ポート 8666 への転送を設定する方法は次のとおりです。

これで解決しない場合は、コードと logcat エラーを投稿してください。

于 2012-06-28T12:53:03.107 に答える
0

Androidコードはエミュレーターで実行されていますか、それともWiFi経由で実際のハードウェアで実行されていますか?エミュレーターで実行している場合、開発マシンのIPアドレスはおそらく10.0.2.2になります(Android開発者ツール:エミュレーターを参照)。

アプリがWiFi経由で接続しているAndroidスマートフォンで実行されている場合は、ループバックアドレスではなく、マシンのIPアドレスを指定する必要があります。

また、SocketServerが127.0.1.1でリッスンしていると言うとき、そのインターフェイスにバインドしていますか?他のインターフェイスからの接続を期待している場合は、ループバックにバインドしないでください。

于 2012-06-28T12:29:17.263 に答える
0

私が正しければ、ソケットサーバーは別のマシンで実行されています。127.0.0.1 を使用して Android フォン経由でそのサーバーに接続することはできません。これがローカル ループ バック アドレスであるためです。マシンの IP アドレスを見つけて、代わりにそれを使用します。

マシンで実行されているソケット サーバーに接続しようとするときにエミュレータで使用する場合、エミュレータのローカル ループ バック アドレスである 127.0.0.1 を使用することはできません。

于 2012-06-28T12:37:58.293 に答える