0

基本的なクライアントサーバーのものから始めようとしています。コンピューターの 1 つで Java サーバー ソケット プログラムを実行しています。私の Android フォンは単純なアプリケーションを実行しており、クライアントとして機能しています。電話をコンピュータの Java プログラムに接続できるようにしたいのですが。

クライアントがコンピュータのローカル IP アドレスに接続しようとしますが、接続できません。IOException が発生します。私が使用しているAndroidコードは次のとおりです。

        try {
            echoSocket = new Socket("192.168.0.19", 7077);
            System.out.println("length: "+ "socket created!");
        } catch (UnknownHostException e) {
            System.out.println("length: "+ "Don't know about host.");
        } catch (IOException e) {
            System.out.println("Couldn't get I/O for "
                    + "the connection.");
        }

コンピューターでクライアントとサーバーの両方を実行し、コンピューターのローカル IP に接続しようとすると (上記と同じ)、正常に動作します。しかし、私は自分の電話から接続したい。

私がしなければならないことはありますか?

編集: スタック トレースは次のとおりです。

   07-21 15:37:34.223: W/System.err(3474): android.os.NetworkOnMainThreadException
07-21 15:37:34.223: W/System.err(3474):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
07-21 15:37:34.223: W/System.err(3474):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
07-21 15:37:34.223: W/System.err(3474):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
07-21 15:37:34.223: W/System.err(3474):     at libcore.io.IoBridge.connect(IoBridge.java:112)
07-21 15:37:34.223: W/System.err(3474):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
07-21 15:37:34.223: W/System.err(3474):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
07-21 15:37:34.223: W/System.err(3474):     at java.net.Socket.startupSocket(Socket.java:566)
07-21 15:37:34.223: W/System.err(3474):     at java.net.Socket.tryAllAddresses(Socket.java:127)
07-21 15:37:34.223: W/System.err(3474):     at java.net.Socket.<init>(Socket.java:177)
07-21 15:37:34.223: W/System.err(3474):     at java.net.Socket.<init>(Socket.java:149)
07-21 15:37:34.223: W/System.err(3474):     at com.nikhildev.cricketeye.MainActivity.startVideoCamera(MainActivity.java:45)
07-21 15:37:34.223: W/System.err(3474):     at java.lang.reflect.Method.invokeNative(Native Method)
07-21 15:37:34.223: W/System.err(3474):     at java.lang.reflect.Method.invoke(Method.java:511)
07-21 15:37:34.223: W/System.err(3474):     at android.view.View$1.onClick(View.java:3594)
07-21 15:37:34.223: W/System.err(3474):     at android.view.View.performClick(View.java:4204)
07-21 15:37:34.223: W/System.err(3474):     at android.view.View$PerformClick.run(View.java:17355)
07-21 15:37:34.223: W/System.err(3474):     at android.os.Handler.handleCallback(Handler.java:725)
07-21 15:37:34.223: W/System.err(3474):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-21 15:37:34.223: W/System.err(3474):     at android.os.Looper.loop(Looper.java:137)
07-21 15:37:34.223: W/System.err(3474):     at android.app.ActivityThread.main(ActivityThread.java:5041)
07-21 15:37:34.233: W/System.err(3474):     at java.lang.reflect.Method.invokeNative(Native Method)
07-21 15:37:34.233: W/System.err(3474):     at java.lang.reflect.Method.invoke(Method.java:511)
07-21 15:37:34.233: W/System.err(3474):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-21 15:37:34.233: W/System.err(3474):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-21 15:37:34.233: W/System.err(3474):     at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

0

Android とソケットでは、いくつかのことに注意する必要があります

  1. Android の IP アドレスはサーバーの IP アドレスよりも頻繁に変更されることが予想されるため、Android をクライアントにする必要があります。
  2. 使用するポート番号は > 1024 である必要があります
  3. エミュレーターの場合、エミュレーターの IP が 10.something であることに注意する必要があります。Android のドキュメントを参照してください。
  4. マニフェストのアクセス許可

最後に、問題は、メイン UI スレッドでネットワーク API を実行していることです。Async タスクでも同じことを実行する必要があります。そのため、StrictMode 例外が発生しています。

編集 :

ping については、ネットワーク ルーターに ping できるかどうかを確認します。また、外の世界に ping できる場合、問題は、ルーターが内部の ping をブロックしていることです。

于 2013-07-22T03:40:28.040 に答える