2014-09-19 2 views
0

Je travaille sur l'application, je veux faire un auditeur TCP. J'ai cherché de nombreux sites pour de l'aide. Je reçois une erreur d'exception. Appelé Socket Closed Exception. Mon code et mon chat sont donnés ci-dessous.Socket Closed Exception?

public class ListenerService extends Service { 

//Socket socket; 
private ServerSocket serverSocket; 
BufferedReader in = null; 
static String message=null; 
int portNo=1619; 
boolean flag=true; 
final static String MY_ACTION = "MY_ACTION"; 
@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
    new Task().execute(); 

} 

@Override 
    public void onDestroy() { 
    super.onDestroy(); 
    flag = false; 
    if (serverSocket != null) { 
     try { 
      serverSocket.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    stopSelf(); 
    Log.d("Server Stoped", "Listener Serverice is Stoped"); 
    // Toast.makeText(this, "Listener Destroyed", Toast.LENGTH_LONG).sho 
    } 
    private class Task extends AsyncTask <Void, String, String> { 
     @Override 
     protected String doInBackground(Void... params) {  
     try { 
      serverSocket = new ServerSocket(portNo); 
      serverSocket.setSoTimeout(0); 
      while (flag) { 
       try { 
        Socket clientSocket = serverSocket.accept(); 
        BufferedReader inputReader = new BufferedReader(
          new InputStreamReader(
            clientSocket.getInputStream())); 
        System.out.println("Client said :" 
          + inputReader.readLine()); 
        message = inputReader.readLine(); 
        Log.d("NETWORK-RECEIVE", "Message!:" + message); 
        publishProgress(message); 


        clientSocket.close(); 

       } catch (SocketTimeoutException e) { 
        e.printStackTrace(); 
       } 
      } 

     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } finally { 
      try { 
       if (serverSocket != null) { 
        serverSocket.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return message; 
    } 
     @Override 
     protected void onProgressUpdate(String... values) { 
      // TODO Auto-generated method stub 
      super.onProgressUpdate(values); 
      Intent i = new Intent(); 
      i.setClass(getApplicationContext(), MainActivity.class); 
      i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      i.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);           
      startActivity(i); 
      messageSend(message); 
     } 



    } 
    protected void messageSend(String values) {    
      Log.d("AFTER", values); 
      Intent intent = new Intent(); 
      intent.setAction(MY_ACTION); 
      intent.putExtra("message", values);    
      sendBroadcast(intent);    
     } 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Auto-generated method stub 
    Log.d("Server Startd","Listener Serverice is running"); 
    //Toast.makeText(getApplicationContext(),"Service Started", Toast.LENGTH_LONG).show(); 
    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

} 

Mon logcate est ici ...

  09-19 12:51:07.229: D/Server Stoped(17878): Listener Serverice is Stoped 
      09-19 12:51:07.229: W/System.err(17878): java.net.SocketException: Socket closed 
      09-19 12:51:07.239: W/System.err(17878): at libcore.io.Posix.accept(Native Method) 
      09-19 12:51:07.239: W/System.err(17878): at libcore.io.BlockGuardOs.accept(BlockGuardOs.java:55) 
      09-19 12:51:07.239: W/System.err(17878): at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:98) 
      09-19 12:51:07.239: W/System.err(17878): at java.net.ServerSocket.implAccept(ServerSocket.java:202) 
      09-19 12:51:07.239: W/System.err(17878): at java.net.ServerSocket.accept(ServerSocket.java:127) 
      09-19 12:51:07.239: W/System.err(17878): at com.vigosol.tcplistener.ListenerService$Task.doInBackground(ListenerService.java:88) 
      09-19 12:51:07.239: W/System.err(17878): at com.vigosol.tcplistener.ListenerService$Task.doInBackground(ListenerService.java:1) 
      09-19 12:51:07.239: W/System.err(17878): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
      09-19 12:51:07.239: W/System.err(17878): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
      09-19 12:51:07.249: W/System.err(17878): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
      09-19 12:51:07.249: W/System.err(17878): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
      09-19 12:51:07.249: W/System.err(17878): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
      09-19 12:51:07.249: W/System.err(17878): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
      09-19 1 

certains peuvent me aider? Tout organisme peut me dire ce que je suis absent ici dans le code?

Répondre

0

Vous avez fermé la ServerSocket alors qu'il était bloqué dans accept().

NB un délai d'attente zéro est infini et ne causera jamais un SocketTimeoutEzception.

0

tout d'abord est préférable de commencer votre AsyncTask sur onStartCommand() et en tant que deuxième Faites attention à la méthode OnDestroy.

Il serait préférable d'utiliser un IntentService et de gérer votre tâche sur onHandleIntent(), est plus simple si vous avez besoin de gérer une seule tâche de thread.

BTW: par Android: Documentations

Si vous utilisez un service ou d'un fil? Un service est simplement un composant qui peut s'exécuter en arrière-plan même si l'utilisateur n'interagit pas avec votre application. Ainsi, vous ne devriez créer un service que si c'est ce dont vous avez besoin. Si vous devez effectuer un travail en dehors de votre thread principal, mais seulement lorsque l'utilisateur interagit avec votre application, alors vous devriez probablement créer un nouveau thread et non un service. Par exemple, si vous voulez lire de la musique, mais seulement pendant que votre activité est en cours, vous pouvez créer un thread dans onCreate(), commencer à l'exécuter dans onStart(), puis l'arrêter dans onStop(). Pensez également à utiliser AsyncTask ou HandlerThread à la place de la classe Thread traditionnelle. Voir le document Processus et Threading pour plus d'informations sur les threads. N'oubliez pas que si vous utilisez un service, il fonctionne toujours par défaut dans le thread principal de votre application. Vous devez donc créer un nouveau thread dans le service s'il effectue des opérations intensives ou de blocage.

Questions connexes