1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

java.net.SocketException: Socket is closed

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Canaboca, 26.08.2011.

  1. Canaboca, 26.08.2011 #1
    Canaboca

    Canaboca Threadstarter Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    18.08.2011
    Hallo :))
    Ich suche schon seit Stunden den Fehler, doch ich komme einfach nicht weiter :((
    Wenn ich mein Wlan einschalte und dann von der Activity zurück möchte, bekomme ich andauern diese Exception:
    java.net.SocketException: Socket is closed
    at java.net.DatagramSocket.checkClosedAndBind(DatagramSocket.java:604)
    at java.net.DatagramSocket.receive(DatagramSocket.java:158)
    at Android.Steuerung.Heizung.run(Heizung.java:158)
    at java.lang.Thread.run(Thread.java:1096)

    Hier mein Code
    HTML:
    //wird in der onCreate methdode ausgeführt
     //wenn ich im WLAN netz drinnen bin, dann beginne ich Daten zu empfangen
      if(mobile.isConnected() == true) {
                //Log.d("network", "IST IM WLAN");
             sendData(REFRESH);
             startSniffing();
      }
     
    //starten des Threads;
     private void startSniffing(){
      if(!tt.isAlive()){
       try {
        receiveSocket = new DatagramSocket(empf_port);
           tt.start();
       }
       catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
      } 
     }
    //stopen des Threads:
    private void stopSniffing(){
      if(tt.isAlive()){
       tt.stop();
       receiveSocket.close();
      }
     }
    //senden der Daten
    [LEFT]public void sendData(String data){
    try{
    DatagramSocket clientSocket = new DatagramSocket();
    InetAddress IPAddress;
    
    
    byte[] sendData = new byte[1024]; 
    sendData=data.getBytes();
    IPAddress = InetAddress.getByName("192.168.0.255");
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, server_port);
    clientSocket.send(sendPacket);
    Log.d("udp tutorial", "senden erfolgreich");
    
    clientSocket.close();
    }
    catch (SocketException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }[/LEFT]
    }
    //Erhalten der Daten:
     public void run() {
      // TODO Auto-generated method stub
      while(true) {
       try {
        byte[] buffer = new byte[1024];
        DatagramPacket p = new DatagramPacket(buffer, buffer.length);
        receiveSocket.receive(p);
        byte[] packet = new byte[p.getLength()];
        System.arraycopy(p.getData(), 0, packet, 0, packet.length);
        text = new String(packet, "UTF8");
        Log.d("Udp tutorial","message:" + text);
        Log.d("RECEIVE", "ERFOLGREICH");   
        handler.sendEmptyMessage(0);
       } 
        catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
       catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
      }
     }
     
    //wenn ich zurück switche rufe ich einfach die stopSniffing und stoppe den Thread
    public void onClick(View v) {[/LEFT]
    if(v.equals(zuruck)){[/LEFT]
    stopSniffing();[/LEFT]
    Intent in = new Intent(Heizung.this,AndroidSteuerung.class);[/LEFT]
    startActivity(in);[/LEFT]
    }
    
     
    Zuletzt bearbeitet: 27.08.2011
  2. v Ralle v, 27.08.2011 #2
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    Also bei dem Code habe ich nicht ganz durchgeblickt, liegt vielleicht auch an der Formatierung.

    Meine Vermutung: du arbeitest mit einigen Threads und mehreren Sockets. Wenn du zurück willst, dann versucht ein Thread sicher noch Daten zu senden, obwohl das Socket schon geschlossen wurde. Überprüfe einfach mal, ob du wirklich alle Threads anhältst und die Sockets dann auch schließt. Wenn ich schon die eine Schleife sehe:

    Code:
    while(true){...}
    Dann bin ich mir ziemlich sicher, dass das Problem in die Richtung geht.
     

Diese Seite empfehlen