2017-09-14 7 views
1

Que faire pour que le serveur fonctionne et reste en écoute lorsque l'application est en arrière-plan?Connexion de la prise Android en arrière-plan

Je suis en train de lancer une erreur: je ne parviens pas à établir une connexion car l'ordinateur cible refuse activement de se connecter.

J'ai un serveur sur android et client sur pc/python.

quelqu'un pourrait expliquer je serai reconnaissant. Code avec mon serveur.

public class MainActivity extends Activity { 

private ServerSocket serverSocket; 

Handler updateConversationHandler; 

Thread serverThread = null; 

private TextView text; 

public static final int SERVERPORT = 8080; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    text = (TextView) findViewById(R.id.textView); 

    updateConversationHandler = new Handler(); 

    this.serverThread = new Thread(new ServerThread()); 
    this.serverThread.start(); 

} 

@Override 
protected void onStop() { 
    super.onStop(); 
    try { 
     serverSocket.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

class ServerThread implements Runnable { 

    public void run() { 
     Socket socket = null; 
     try { 
      serverSocket = new ServerSocket(SERVERPORT); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     while (!Thread.currentThread().isInterrupted()) { 

      try { 

       socket = serverSocket.accept(); 

       CommunicationThread commThread = new CommunicationThread(socket); 
       new Thread(commThread).start(); 

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

class CommunicationThread implements Runnable { 

    private Socket clientSocket; 

    private BufferedReader input; 

    public CommunicationThread(Socket clientSocket) { 

     this.clientSocket = clientSocket; 

     try { 

      this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); 

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

    public void run() { 

      try { 

       String read = input.readLine(); 

       updateConversationHandler.post(new updateUIThread(read)); 

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

    } 

} 

class updateUIThread implements Runnable { 
    private String msg; 

    public updateUIThread(String str) { 
     this.msg = str; 
    } 
    @Override 
    public void run() { 
     if (msg == null) { 
      text.setText(msg); 
     } 
     else{ 
      text.setText(msg); 
      createNotification(); 
     } 
    } 
} 
void createNotification() { 

    Intent intent = new Intent(this, MainActivity.class); 
    PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0); 

    Bitmap icon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); 

    Notification noti = new NotificationCompat.Builder(this) 
      .setContentTitle("NOTIFICATION") 
      .setContentText("NOTIFICATION") 
      .setTicker("NOTIFICATION") 
      .setSmallIcon(android.R.drawable.ic_dialog_info) 
      .setLargeIcon(icon) 
      .setAutoCancel(true) 
      .setContentIntent(pIntent) 
      .build(); 

    NotificationManager notificationManager = 
      (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

    notificationManager.notify(0, noti); 
}} 

Répondre

1

Pour effectuer des tâches d'arrière-plan dans Android, vous devez utiliser les services.
Un service pour le serveur ressemblerait à ceci:

public class MyService extends Service { 

    public static final String START_SERVER = "startserver"; 
    public static final String STOP_SERVER = "stopserver"; 
    public static final int SERVERPORT = 8080; 

    Thread serverThread; 
    ServerSocket serverSocket; 

    public MyService() { 

    } 

    //called when the services starts 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     //action set by setAction() in activity 
     String action = intent.getAction(); 
     if (action.equals(START_SERVER)) { 
      //start your server thread from here 
      this.serverThread = new Thread(new ServerThread()); 
      this.serverThread.start(); 
     } 
     if (action.equals(STOP_SERVER)) { 
      //stop server 
      if (serverSocket != null) { 
       try { 
        serverSocket.close(); 
       } catch (IOException ignored) {} 
      } 
     } 

     //configures behaviour if service is killed by system, see documentation 
     return START_REDELIVER_INTENT; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Return the communication channel to the service. 
     throw new UnsupportedOperationException("Not yet implemented"); 
    } 

    class ServerThread implements Runnable { 

     public void run() { 
      Socket socket; 
      try { 
       serverSocket = new ServerSocket(SERVERPORT); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      while (!Thread.currentThread().isInterrupted()) { 

       try { 

        socket = serverSocket.accept(); 

        CommunicationThread commThread = new CommunicationThread(socket); 
        new Thread(commThread).start(); 

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

    class CommunicationThread implements Runnable { 

     private Socket clientSocket; 

     private BufferedReader input; 

     public CommunicationThread(Socket clientSocket) { 

      this.clientSocket = clientSocket; 

      try { 

       this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); 

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

     public void run() { 

      try { 

       String read = input.readLine(); 

       //update ui 
       //best way I found is to save the text somewhere and notify the MainActivity 
       //e.g. with a Broadcast 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 
} 

Dans votre activité, vous pouvez démarrer le service en appelant:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //will start the server 
    Intent startServer = new Intent(this, MyService.class); 
    startServer.setAction(MyService.START_SERVER); 
    startService(startServer); 

    //and stop using 
    Intent stopServer = new Intent(this, MyService.class); 
    stopServer.setAction(MyService.STOP_SERVER); 
    startService(stopServer); 
} 

aussi vous devez déclarer l'autorisation d'Internet dans votre AndroidManifest.xml . Ajoutez-les aux lignes ci-dessus de la balise:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
0

Vous testez cela sur un réseau local ou via Internet (WAN)?

Il faut tenir compte du fait que de nombreux fournisseurs de téléphonie mobile n'attribuent pas d'adresses IP publiques aux appareils connectés, ils attribuent une adresse IP privée et donc l'appareil ne peut pas fonctionner comme un serveur