Как проверить, подключен ли сокет TCP в приложении для Android - PullRequest
3 голосов
/ 14 ноября 2011

Я пишу короткое тестовое приложение, чтобы попрактиковаться в подключении к серверу. Все, что делает приложение, - это берет IP из поля editText, а затем подключается к серверу. Похоже, я могу подключиться к серверу, потому что могу отправить данные на сервер и распечатать их.

Я хотел добавить проверку ошибок, чтобы подтвердить, что я подключен, прежде чем пытаться что-либо отправить на сервер. Однако проблема заключается в том, что всякий раз, когда я использую методы 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 ]

1 голос
/ 15 ноября 2011

Я согласен, что ваш код не в том месте в цикле TRY/CATCH, вероятно, является причиной вашей проблемы.

В ответ на ваш вопрос о isBound и isConnected, вот их определения.

public boolean isBound ()

Возвращает, связан ли данный сокет с локальным адресом и портом.
Возвращает true, если сокет связан с локальным адресом, иначе false.


public boolean isConnected ()

Возвращает, подключен ли этот сокет к удаленному хосту.
Возвращает true, если сокет подключен, иначе false.

1 голос
/ 15 ноября 2011

Во-первых, ваш

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

блок находится не в том месте. Если сработал какой-либо блок перехвата, он выполнит вышеуказанный блок. Но если возникает исключение, это означает, что s, вероятно, будет нулевым, поэтому у вас есть определенное исключение NullPointerException. (сбой приложения) Соответствующее место находится внутри блока try.

Во-вторых, как вы можете видеть из журнала logcat, соединение, которое вы пытаетесь установить, отказывается. Возможно, что-то не так с ip / портом или брандмауэром.

Кроме того, logcat информирует вас о том, что у вас, вероятно, есть необнаруженное исключение.

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

Устраните эту проблему и, если проблема не устранена, приходите снова обсудить ее.

...