2017-09-13 3 views
-1

J'ai récemment développé une application qui peut utiliser java socket pour se connecter à la socket serveur java dans le PC. Ce code fonctionne parfaitement lorsqu'il se connecte au serveur qu'il envoie String immédiatement après que le thread ait été appelé mais je ne sais pas pourquoi quand je ferme le serveur et l'essaye alors il ne jette pas d'exception immédiatement mais après 1 minute la page reste inactive page appelée.Exception de lancement de socket seulement après 1 minutes

Voici le fichier logcat lorsque le serveur est ouvert et aussi quand il proche: https://imgur.com/a/lOqdq

public class checksession implements Runnable 
    { 
    private Activity activity; 
    Socket soc; 

    public checksession(Activity activity) 
    { 
     //get activity from class called 
     this.activity=activity; 
     //this.soc=soc; 

    } 


    @Override 
    public void run() 
    { 
     try{ 

      soc=new Socket("192.168.0.113",11000); 


      DataOutputStream dout=new DataOutputStream(soc.getOutputStream()); 


      //request format --> requestkey-field required 
      //format for LG request--> LG-username-password 
      String sendrequest="SS"; 

      //send requestcode to server 
      dout.writeUTF(sendrequest); 
      dout.flush();//refresh to make sure it send to the server 

      //wait for input 
      DataInputStream dis=new DataInputStream(soc.getInputStream()); 
      final String codefromserver=(String)dis.readUTF(); 
      System.out.println("reply:"+codefromserver); 


      String replycode[]= codefromserver.split("-"); 

      //server reply code format 
      // if not used on database RE-CK-NO 
      //if used on database RE-CK-YES 

      String sessionavailableornot=replycode[2]; 

      if(sessionavailableornot.equals("YES")) 
      { 
       activity.runOnUiThread(new Runnable() { 
        public void run() { 
         //Do your UI operations like dialog opening or Toast here 
         //navigate user to main screen 
         Intent in = new Intent(activity, sessiondetected.class); 
         in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         activity.startActivity(in); 
        } 
       }); 

      } 

      soc.close(); 

     }catch(Exception e) { 
      //runOnUiThread function is to let the function to be run on main thread 
      //bacause UI function cannot be run on worker thread 
      activity.runOnUiThread(new Runnable() { 
       public void run() { 
        //Do your UI operations like dialog opening or Toast here 
        //navigate user back to connectionerror page so that user know 
        Intent inerr = new Intent(activity, serverconnectionerror.class); 
        inerr.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        activity.startActivity(inerr); 
       } 
      }); 
     } 

    } 
} 
+1

deux secondes avec 'soc.setSoTimeout (2000);' juste après 'soc = new Socket (" 192.168.0.113 ", 11000);'? –

+0

Vous n'avez défini aucun délai d'attente ici. Vous obtenez donc les délais d'expiration par défaut de la plate-forme, qui sont d'environ une minute pour les délais d'attente de connexion, et l'infini pour les délais d'attente de lecture. Pas clair ce que vous demandez. – EJP

+0

@MickMnemonic Il est toujours le même que j'ai défini le délai T_T –

Répondre

0

Vous devez spécifier les valeurs de délai d'attente pour la prise; sinon, les paramètres par défaut de la plate-forme seront utilisés.

Le code suivant définit le SO_TIMEOUT (délai de lecture de la socket) et les valeurs de délai d'attente de connexion avant d'ouvrir le socket. Et si vous essayez de régler `SO_TIMEOUT`, par exemple,

final int timeout = 2000; // in millis 
soc = new Socket(); 
soc.setSoTimeout(timeout); 
soc.connect(new InetSocketAddress("192.168.0.113", 11000), timeout);