2016-12-23 40 views
1

クライアント(android(java)) - server(node.js)アプリケーションを作成しました。Androidソケット接続の問題

私のプログラムをテストするためにAVDエミュレータ(10.0.2.2またはexteranl IPを使用)を使用すると問題が発生します.ewerythingはうまく動作しますが、電話や別のエミュレータ(genimotion、nox、bluestacks)私はまったく接続できません。

インターネットとWi-Fiを使用することが許可されているユーザーは必須です。 connect関数のコードは次のとおりです。

public void Connect(String Host, int Port) 
{ 
    try 
    { 
     System.out.println(Handlers.isEmpty()); 
     if (Handlers.isEmpty()) 
      throw new NullPointerException ("No handlers"); 

     if (Socket != null && Socket.isConnected()) 
      Socket.close(); 

     InetAddress IpAddress = InetAddress.getByName(Host); 
     Address = new InetSocketAddress(IpAddress, Port); 
     Socket = new Socket(); 
     Socket.setSoTimeout(1000); 
     Socket.connect(Address, 1500); 
     InputStream = new BufferedReader (new InputStreamReader(Socket.getInputStream())); 
     OutputStream = new PrintWriter (Socket.getOutputStream()); 
     RThread = new ReadSocketThread(InputStream, Handlers, SearchName); 
     ReadSocket = new Thread(RThread); 
     ReadSocket.start(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

} 

とコンソールは言った:

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: bobko.alexandr.consultant, PID: 1599 
       java.lang.IllegalStateException: Could not execute method for android:onClick 
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 
        at android.view.View.performClick(View.java:4438) 
        at android.view.View$PerformClick.run(View.java:18422) 
        at android.os.Handler.handleCallback(Handler.java:733) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:136) 
        at android.app.ActivityThread.main(ActivityThread.java:5045) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:515) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
        at dalvik.system.NativeStart.main(Native Method) 
       Caused by: java.lang.reflect.InvocationTargetException 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:515) 
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
        at android.view.View.performClick(View.java:4438)  
        at android.view.View$PerformClick.run(View.java:18422)  
        at android.os.Handler.handleCallback(Handler.java:733)  
        at android.os.Handler.dispatchMessage(Handler.java:95)  
        at android.os.Looper.loop(Looper.java:136)  
        at android.app.ActivityThread.main(ActivityThread.java:5045)  
        at java.lang.reflect.Method.invokeNative(Native Method)  
        at java.lang.reflect.Method.invoke(Method.java:515)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)  
        at dalvik.system.NativeStart.main(Native Method)  
       Caused by: android.os.NetworkOnMainThreadException 
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 
        at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
        at libcore.io.IoBridge.connectErrno(IoBridge.java:144) 
        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:843) 
        at bobko.alexandr.consultant.STAPLibrary.STAPLibraryMain.Connect(STAPLibraryMain.java:53) 
        at bobko.alexandr.consultant.MainActivity.Create(MainActivity.java:29) 
        at java.lang.reflect.Method.invokeNative(Native Method)  
        at java.lang.reflect.Method.invoke(Method.java:515)  
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  
        at android.view.View.performClick(View.java:4438)  
        at android.view.View$PerformClick.run(View.java:18422)  
        at android.os.Handler.handleCallback(Handler.java:733)  
        at android.os.Handler.dispatchMessage(Handler.java:95)  
        at android.os.Looper.loop(Looper.java:136)  
        at android.app.ActivityThread.main(ActivityThread.java:5045)  
        at java.lang.reflect.Method.invokeNative(Native Method)  
        at java.lang.reflect.Method.invoke(Method.java:515)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)  
        at dalvik.system.NativeStart.main(Native Method)  

アプリケーションが終了しました。

+0

「まったく接続できません」と言うと、どういうことが起こりますか? –

+0

はエラーのスクリーンショットを追加しました。アプリケーションは何らかの理由でIPでサーバーを見つけることができません – user230288

+1

stacktraceを含めるように質問を編集してください - 画像にリンクを投稿しないでください:) –

答えて

0

メインスレッドでネットワーク操作を実行しているときに、NetworkOnMainThreadExceptionがスローされます。そのため、あなたは接続できません。

AsyncTask内のネットワークに接続するコードをラップするか、Retrofitのようなライブラリを使用する必要があります。単純に、ネットワーク操作はメインのUIスレッド以外のスレッドで実行する必要があります。

+0

これは実際に私の最初のseriosアプリケーションです。私が行った孤独は間違っていると思うが、私はクラスを作成し、それをBasicActivityと呼んだ。このクラスでは、私はサーバーに接続しましたが(AsyncTaskではありません)、その後、新しいアクティビティを作成するときに、このクラスを拡張しました。したがって、私の考えによれば、最後のアクティビティが破棄された後で接続を終了する必要があります。それが正しいか? – user230288