如何检查TCP套接字是否在Android应用程序中连接 [英] How to check if TCP socket is connected in android app

查看:186
本文介绍了如何检查TCP套接字是否在Android应用程序中连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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.

我想添加一些错误检查确认我尝试发送任何东西到服务器之前连接。然而,问题是,每当我使用Socket.isConnected()或isBound()方法我的应用程序崩溃。

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.

那么如何检查如果我连接if这些方法似乎不工作。正如我所说,我知道我已连接,因为我可以发送东西到服务器。

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.

下面是代码,我按下按钮连接。我想做的是确认我已连接,然后启动一个线程,将工作在后台发送和接收来自服务器的数据。在说s.isBound()的部分,程序崩溃。我甚至可以放在s.isConnected(),它也会崩溃。

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.

最后,isBound和isConnected有什么区别?

Last, what is the difference between isBound, and 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)


推荐答案

首先,

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

如果任何catch块被触发,那么它将执行上面的块。但是,如果引发异常意味着 s 可能为null,因此您有一个特定的NullPointerException。 (应用程序崩溃)适当的位置在 try 块内。

block is at a wrong place. If any catch block triggered, then it will execute the above block. But if an exception is raised that means that s will probably be null, so you have a certain NullPointerException. (crash of the application) The appropriate place is inside the try block.

其次, logcat日志,您尝试建立的连接拒绝。可能是ip / port或防火墙有问题。

Secondly, as you can see from the logcat log, the connection that you are trying to establish refuses. Perhaps there is something wrong with the ip/port or a firewall.

还有logcat通知你可能有未捕获的异常。

Also logcat informs you that you probably have an uncaught exception.

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

修复问题,如果问题仍然存在,请再次讨论。

Fix that problems and if the problem persist come again to discuss it.

这篇关于如何检查TCP套接字是否在Android应用程序中连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆