如何检查在Android应用程序中是否连接了TCP套接字

时间:2011-11-14 18:11:20

标签: android sockets tcp client-server

我正在编写一个简短的测试应用程序来练习连接到服务器。所有的应用程序都是从editText框中获取IP,然后连接到服务器。看起来我可以连接到服务器,因为我能够将数据发送到服务器并让服务器打印它。

我想在尝试向服务器发送任何内容之前添加一些错误检查以确认我已连接。但问题是,每当我使用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)

2 个答案:

答案 0 :(得分:1)

首先,你的

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

块位于错误的位置。如果触发了任何catch块,那么它将执行上面的块。但是如果引发异常意味着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 :(得分:1)

我同意您的代码在TRY/CATCH循环中放错位置可能是您问题的根源。

在回答有关isBoundisConnected的问题时,以下是其定义。

  

public boolean isBound ()

     

返回此套接字是否绑定到本地地址和端口   如果套接字绑定到本地地址,则返回true,否则返回false。


  

public boolean isConnected ()

     

返回此套接字是否连接到远程主机   如果套接字连接则返回true,否则返回false。