title: How to check if TCP socket is connected in android app
body: <p>I'm writing a short test app to practice connecting to a server. All the app does is take an IP from an editText box, and then connect to the server. It looks like I can connect to the server because I am able to send data to the server and have the server print it.</p>
  
  <p>I wanted to add some error checking to confirm that I am connected before attempting to send anything to the server. However, the problem is, whenever I use the Socket.isConnected() or isBound() methods my app crashes.</p>
  
  <p>So how do I check if I'm connected if these methods doesn't seem to work. As I said, I know I'm connected because I can send stuff to the server.</p>
  
  <p>Below is the code, I connect on the press of a button. What I want to do is confirm that I'm connected, and then kick off a thread that will work in the background sending and receiving data from the server. In the section that say's s.isBound() is where the program crashes. I can even put in s.isConnected() and it will crash also.</p>
  
  <p>Last, what is the difference between isBound, and isConnected?</p>
  
  <pre><code>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();
                  }
  
              }
          }
      }
  };
  </code></pre>
  
  <p>This is what the log outputs.</p>
  
  <pre><code>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.&lt;init&gt;(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)
  </code></pre>