2011-11-14 79 views
2

我在寫一個簡短的測試應用程序來練習連接到服務器。所有的應用程序都是從editText框中獲取IP,然後連接到服務器。它看起來像我可以連接到服務器,因爲我能夠將數據發送到服務器並讓服務器打印它。如何檢查是否在Android應用程序中連接了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

好的,我剛剛添加它。 –

+0

好吧, 我想我想通了。套接字無法連接時返回null。所以我應該檢查的是如果s == null。 另外,s = new Socket();方法在服務器可用時拋出異常。使用代碼的catch部分來編寫處理其餘部分的東西是否合適?例如,當catch語句執行時,我可以添加一個toast消息,這個消息說「沒有找到服務器?」還是有更好的方法來處理這個問題? –

回答

1

首先,你

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

塊是在錯誤的地方。如果任何catch塊觸發,那麼它將執行上述塊。但是,如果發生異常,則表示s可能爲空,因此您有一定的NullPointerException。 (應用程序崩潰)合適的地方在try區塊內。

其次,您可以從logcat日誌中看到,您嘗試建立的連接拒絕。也許ip /端口或防火牆有問題。

此外,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

嗯,是的,但我不知道綁定和連接是什麼意思。對我來說,它看起來像他們描述完全一樣的東西。 –

相關問題