2011-11-14 9 views
2

私はサーバに接続するための短いテストアプリを書いています。すべてのアプリケーションは、editTextボックスからIPを取得し、サーバーに接続します。私はサーバーにデータを送信し、サーバーがそれを印刷することができるので、私はサーバーに接続できるように見えます。TCPソケットがアンドロイドアプリに接続されているかどうかを確認する方法

私は私がサーバーに何かを送信しようとする前に接続していたことを確認するためにチェックするいくつかのエラーを追加したいです。しかし、問題は、私がSocket.isConnected()またはisBound()メソッドを使用するたびにアプリケーションがクラッシュすることです。

私は接続していた場合、これらのメソッドは動作していないようならば、どのように私がチェックします。私が言ったように、私は物事をサーバーに送ることができるので、私は接続されていることを知っています。

以下はコードですが、ボタンを押すと接続されます。私がしたいのは、私が接続されていることを確認し、バックグラウンドで動作し、サーバーからデータを送受信するスレッドを開始することです。 s.isBound()は、プログラムがクラッシュする場所です。私はs.isConnected()に入れることもでき、クラッシュします。

最後に、isBoundとisConnectedの違いは何ですか?

private OnClickListener connectListener = new OnClickListener() {    
    @Override 
    public void onClick(View v) { 
     if (!connected) { 
      serverIpAddress = serverIp.getText().toString(); 
      if (!serverIpAddress.equals("")) { 
       try{ 
        InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
        Log.d("ClientActivity", "Trying to Connect"); 
        s = new Socket(serverAddr, SERVERPORT); 
        Log.d("ClientActivity", "Connected"); 

        output = s.getOutputStream(); 

        input = s.getInputStream(); 

       } 
       catch (UnknownHostException e) { 
        e.printStackTrace(); 
       } 
       catch (IOException e) { 
        e.printStackTrace(); 
       } 

       if(s.isBound()){ 
        connected = true; 
        cThread = new Thread(new ClientThread()); 
        cThread.setName("Client Connection Thread"); 
        cThread.start(); 
       } 

      } 
     } 
    } 
}; 

これはログの出力です。

11-13 17:03:56.718: D/ClientActivity(2039): Trying to Connect 
11-13 17:03:56.757: W/System.err(2039): java.net.ConnectException: /192.168.16.1:6340 - Connection refused 
11-13 17:03:56.757: W/System.err(2039):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:207) 
11-13 17:03:56.757: W/System.err(2039):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:183) 
11-13 17:03:56.757: W/System.err(2039):  at java.net.Socket.startupSocket(Socket.java:705) 
11-13 17:03:56.757: W/System.err(2039):  at java.net.Socket.<init>(Socket.java:263) 
11-13 17:03:56.757: W/System.err(2039):  at com.AUIEE.client_test.Client_TestActivity$1.onClick(Client_TestActivity.java:88) 
11-13 17:03:56.757: W/System.err(2039):  at android.view.View.performClick(View.java:2485) 
11-13 17:03:56.765: W/System.err(2039):  at android.view.View$PerformClick.run(View.java:9089) 
11-13 17:03:56.765: W/System.err(2039):  at android.os.Handler.handleCallback(Handler.java:587) 
11-13 17:03:56.765: W/System.err(2039):  at android.os.Handler.dispatchMessage(Handler.java:92) 
11-13 17:03:56.773: W/System.err(2039):  at android.os.Looper.loop(Looper.java:130) 
11-13 17:03:56.773: W/System.err(2039):  at android.app.ActivityThread.main(ActivityThread.java:3859) 
11-13 17:03:56.773: W/System.err(2039):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-13 17:03:56.773: W/System.err(2039):  at java.lang.reflect.Method.invoke(Method.java:507) 
11-13 17:03:56.773: W/System.err(2039):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:840) 
11-13 17:03:56.773: W/System.err(2039):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:598) 
11-13 17:03:56.773: W/System.err(2039):  at dalvik.system.NativeStart.main(Native Method) 
11-13 17:03:56.781: D/AndroidRuntime(2039): Shutting down VM 
11-13 17:03:56.781: W/dalvikvm(2039): threadid=1: thread exiting with uncaught exception (group=0x4001e560) 
11-13 17:03:56.789: E/AndroidRuntime(2039): FATAL EXCEPTION: main 
11-13 17:03:56.789: E/AndroidRuntime(2039): java.lang.NullPointerException 
11-13 17:03:56.789: E/AndroidRuntime(2039):  at com.AUIEE.client_test.Client_TestActivity$1.onClick(Client_TestActivity.java:103) 
11-13 17:03:56.789: E/AndroidRuntime(2039):  at android.view.View.performClick(View.java:2485) 
11-13 17:03:56.789: E/AndroidRuntime(2039):  at android.view.View$PerformClick.run(View.java:9089) 
11-13 17:03:56.789: E/AndroidRuntime(2039):  at android.os.Handler.handleCallback(Handler.java:587) 
11-13 17:03:56.789: E/AndroidRuntime(2039):  at android.os.Handler.dispatchMessage(Handler.java:92) 
11-13 17:03:56.789: E/AndroidRuntime(2039):  at android.os.Looper.loop(Looper.java:130) 
11-13 17:03:56.789: E/AndroidRuntime(2039):  at android.app.ActivityThread.main(ActivityThread.java:3859) 
11-13 17:03:56.789: E/AndroidRuntime(2039):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-13 17:03:56.789: E/AndroidRuntime(2039):  at java.lang.reflect.Method.invoke(Method.java:507) 
11-13 17:03:56.789: E/AndroidRuntime(2039):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:840) 
11-13 17:03:56.789: E/AndroidRuntime(2039):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:598) 
11-13 17:03:56.789: E/AndroidRuntime(2039):  at dalvik.system.NativeStart.main(Native Method) 
+0

isBound()またはisConnected()を使用してプログラムがクラッシュすると、ログアウト出力を追加します。 – Manos

+0

OK、私はそれを追加しました。 –

+0

Ok、 私はそれを理解したと思います。接続できない場合、ソケットはnullを返します。ですから、s == nullならチェックする必要があります。 また、s =新しいSocket();サーバーが使用可能なときにメソッドが例外をスローします。コードのcatchセクションを使用して残りのすべてを処理するものを書くのが適切でしょうか?たとえば、catchステートメントが実行されるときに、「サーバーが見つかりません」というトーストメッセージを追加できます。または、これを処理するより良い方法はありますか? –

答えて

1

まず、あなたの

if(s.isBound()){ 
    connected = true; 
    cThread = new Thread(new ClientThread()); 
    cThread.setName("Client Connection Thread"); 
    cThread.start(); 
} 

ブロックは間違った場所です。キャッチブロックがトリガーされた場合、上記のブロックが実行されます。しかし、例外が発生した場合は、sがnullになる可能性があるので、特定のNullPointerExceptionがあることを意味します。 (アプリケーションのクラッシュ)適切な場所はtryブロック内にあります。あなたはlogcatログから見ることができるように

第二に、あなたが確立しようとしているという接続は拒否します。おそらく、ip/portやファイアウォールに問題があります。

また、logcatは、キャッチされない例外がある可能性があることを通知します。

1-13 17:03:56.781: W/dalvikvm(2039): threadid=1: thread exiting with uncaught exception (group=0x4001e560) 

この問題を修正し、問題が解決しなくなった場合は、問題を解決してください。

1

私はTRY/CATCHループ内で紛失あなたのコードは、おそらくあなたの問題の根本であることに同意します。ここisBoundisConnectedに関するご質問への答えで

は、その定義されています。このソケットがローカルアドレスとポートにバインドされているかどうか

public boolean isBound()

返します。
ソケットがローカルアドレスにバインドされている場合はtrueを返し、そうでない場合はfalseを返します。

public boolean isConnected()

このソケットは、リモートホストに接続されているかどうかを返します



ソケットが接続されている場合はtrueを返し、そうでない場合はfalseを返します。

+0

さて、確かに、縛られてつながっていることが何を意味するのか分かりません。私にとっては、まったく同じことを説明するように見えます。 –