2 votes

Le système Android tue mon serversocket dans le service

Je suis en train d'écrire une application d'exemple pour créer un serveur sur Android et un client pour se connecter à un PC. J'ai mis le serversocket dans un thread d'un service. Tout se passe parfaitement, jusqu'à ce que quelques minutes après l'écran s'éteigne. Cela peut être Android qui tue mon serveur, j'ai essayé de mettre un verrouillage complet à mon code et il ne se fait plus tuer, cependant, JE veux que l'écran s'éteigne comme d'habitude. Voici mon code:

public class MessageListener extends Service {

    private ServerSocket serverSocket;

    @Override
    public void onCreate() {
        Log.v("Test", "Créer un service");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

         PowerManager.WakeLock wl=null;
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
         wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
         wl.acquire();
        startServer();
        if(wl!=null) wl.release();

        return START_STICKY;
    }

    private Runnable thread = new Runnable() {

        @Override
        public synchronized void run() {
            try {

                serverSocket = new ServerSocket(Integer.parseInt(5000));
                ObjectInputStream in = null;

                while (true) {

                    Socket client = serverSocket.accept();

                    Log.v("TCP", "S: Réception en cours...");
                    try {
                        in = new ObjectInputStream(client.getInputStream());

                        DataInController data = new DataInController(
                                getApplicationContext());
                        data.processDataIn(in.readObject(), client);

                    } catch (ClassNotFoundException e) {
                        System.out.println("TCP S: Erreur dans l'écoute du serveur PC");
                        e.printStackTrace();

                    } finally {
                         client.close();    
                    }
                }

            } catch (IOException e) {
            }

        }

    };
    private Thread serverThread;

    private synchronized void startServer() {
        if (serverThread == null) {
            serverThread = new Thread(thread);
            serverThread.start();
        }
    }

    private synchronized void stopServer() {
        if(serverThread!=null){
            Thread t=serverThread;
            serverThread=null;
            t.interrupt();
        }

    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v("TCP", "Service en cours d'arrêt !!!!!!!!!!!!!!!!!!!!!!!");
        if (serverSocket != null) {
            try {
                serverSocket.close();
                stopServer();
                Log.v("TCP", "Serveur socket fermé");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

3voto

chr Points 1918

Deux choses qui ont fonctionné pour nous:

  • Verrouillage Wi-Fi
  • Configurer la politique de veille du Wi-Fi sur "jamais". Certains appareils éteindront la radio Wi-Fi sans ce paramètre, même lorsqu'un programme a un verrou sur la radio Wi-Fi.

0voto

Cuong Thai Points 832

J'ai trouvé le problème. C'est que le routeur a perdu la connexion avec Android. J'ai essayé de le pinguer et il a dit "inaccessible", après avoir reconnecté au wifi, ça fonctionne, mais après un moment, ça revient

0voto

aloneguid Points 2122

Essayez également de garder WakeLock. Faire les deux fonctionne pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X