2015-01-10 3 views
0

У меня есть небольшая проблема с гнездом. Итак, код ниже:Socket говорит, что он закрыт, но это не

private class SocketThread extends Thread { 

    String whatistodo; 

    public SocketThread(String whatistodo) { 
     this.whatistodo = whatistodo; 
    } 

    @Override 
    public void run() { 
     try { 

      Socket socket = new Socket(IP (is set), port (is set)); // Eröffne Socket 

      if(whatistodo.equals("read")) { 

       Boolean isDone = false; 
       InputStream is = socket.getInputStream();     
       InputStreamReader isr = new InputStreamReader(is);  

       BufferedReader br = new BufferedReader(isr);    // In Buffer 

       String msg;           


       while (!isDone && ((br.readLine()) != null)) {  

        // stuff 
        System.out.println(msg); 

       } 

      } 

      if(whatistodo.equals("close")) { 

       socket.close(); 

       if(socket.isClosed()) { 

        finish(); 

       } 
      } 

      Log.d("Socket", String.valueOf(socket.isClosed())); 



     } catch (IOException e1) { 


     /* Log.e("IOException", String.valueOf(e1)); 



      Looper.prepare(); 

      new AlertDialog.Builder(Bedienung.this) 
        .setTitle("Socketfehler") 
        .setMessage("Verbindung mit TCP fehlgeschlagen/verloren.") 
        .setPositiveButton("Ok", null) 
        .setIcon(android.R.drawable.ic_dialog_alert) 
        .show(); 

      Looper.loop(); */ 

     } 



    } 

} 

Я называю класс SocketThread с функцией connectToSocket(); Там один строковый параметр называется «whatistodo». Параметр может быть «читать» или «закрыть»

 protected Boolean connectToSocket(String whatistodo) { 

    Thread obj = new SocketThread(whatistodo); 
    obj.start(); 

    return false; 

} 

Функция connectToSocket("read") вызывается, если есть подключение к Интернету. Функция connectToSocket("close") вызывается onBackPressed.

Но после закрытия сокета я все еще получаю сообщения.

Как это решить?

Привет, Baldoius

+0

Тестирование 'isClosed()' после того, как вы только что назвали 'close()' тщетным. Он всегда будет возвращать true. – EJP

ответ

1

Каждый раз, когда вы создаете свой SocketThread, он создает новый сокет. Если «whatistodo» установлен на «close», он создаст новый сокет и немедленно его закроет. Поток, созданный с помощью «whatistodo», равным «read», имеет свой собственный сокет, поэтому он будет продолжать работать и читать из него.

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

+0

Как вы это сделаете? –

+0

Передайте экземпляр Socket в качестве параметра конструктору Thread. – yole

+0

Это было нелегко, но теперь он работает. Спасибо! –

Смежные вопросы