3

Javaアプリケーションとして完全に機能するサーバーコードとクライアントコードがあります。サーバーはローカルマシンで実行され、ポート4444でリッスンします。どのJavaアプリケーションでも簡単に接続できますが、コードをAndroidに移動すると、何を試してもIOExceptionが発生し続けます。「localhost」を「10.0.2.2」に変更する必要があると読みましたが、それでもIOExceptionが発生します。whatsmyip.orgからIPアドレスを試しましたが、それでもIOExceptionが発生します。これが私のAndroidコードです...

package test.myPackage;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class TestProjectActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tv = new TextView(this);
        tv.setText("Hello, Android");
        setContentView(tv);

    Socket s = null;
    try {
        s = new Socket("10.0.2.2", 4444);
        tv.setText("socket: CONNECTED!");
    } catch (UnknownHostException e) {
        tv.setText("socket: unknown host");
    } catch (IOException e) {
        tv.setText("socket: IO Exception");
    }
}

}

4

2 に答える 2

2

まず、アプリにインターネット権限があることを確認してください。

10.0.2.2エイリアスを使用できるのは、アプリがエミュレーターで実行されていて、ホスティングマシンで実行されているものに接続したい場合のみです。これは実際のAndroidデバイスでは機能しません。

実際のAndroidデバイスの場合、サーバーをホストしているPCと同じwifiネットワークにデバイスを配置するか、テザリングソリューションを悪用して、USBケーブルを介して同じネットワークにデバイスを配置する方法を見つけるか、サーバーを移動する必要があります。デバイスのモバイルネットワーク接続からアクセスできるようにするために、インターネット全体から外部からアクセス可能なマシンに接続します。

そして、EvilDuckは間違いなくUIスレッドを悪用することについてのポイントを持っています。

于 2012-04-26T17:56:20.517 に答える
0

サーバーと同じネットワーク内のデバイスでAndroidクライアントを実行していると理解していますか?次に、サーバーの内部IPを使用する必要があります。ここのローカルホストは明らかにデバイス上のサーバーを検索します。

whatsmyip.orgは外部IPを提供します。

デバイスが実際に同じネットワーク上にあることを確認し、正しい内部IPを使用していることを確認し、サーバーにLAN用のこのポートをブロックするファイアウォールがないことを確認します。

そして、UIスレッドffsでのネットワークアクティビティの実行を停止します!!!

于 2012-04-26T15:42:47.290 に答える