2010-08-09 31 views
0

Dans mon application Android, j'essaie de me connecter à un port sur un serveur local pour obtenir des paquets. Je suis enfermé à code dans certains tentent & de prises mais avec le code suivant:Programmation réseau Android: IOExceptions et StackOverflowError

address = "192.168.175.82"; 
public void run() { 
    try { 
    smtpSocket = new Socket(address, 60001); 

     os = new DataOutputStream(smtpSocket.getOutputStream()); 
     is = new DataInputStream(smtpSocket.getInputStream()); 
    } catch (UnknownHostException e) { 
     System.err.println("Don't know about host: " + address); 
     run(); 
    } catch (IOException e) { 
     System.err.println("Couldn't get I/O for the connection to: " + address); 
     run(); 
    } catch (Exception e) { 
    System.out.println("retry"); 
    run(); 
    } 

si ther serveur est pas, je reçois évidemment le IOException plusieurs fois (par exemple quelques centaines de fois) avant que je reçois erreur de dépassement de pile et l'application se bloque.

01-20 22:21:32.526: ERROR/AndroidRuntime(5678): java.lang.StackOverflowError 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at java.util.Hashtable.get(Hashtable.java:282) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at java.util.Properties.getProperty(Properties.java:177) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at java.lang.System.getProperty(System.java:440) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at java.lang.System.getProperty(System.java:412) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at java.lang.Boolean.getBoolean(Boolean.java:174) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at org.apache.harmony.luni.net.NetUtil$Action.run(NetUtil.java:89) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at org.apache.harmony.luni.net.NetUtil$Action.run(NetUtil.java:80) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at java.security.AccessController.doPrivilegedImpl(AccessController.java:264) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at java.security.AccessController.doPrivileged(AccessController.java:84) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at org.apache.harmony.luni.net.NetUtil.preferIPv6Addresses(NetUtil.java:51) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at org.apache.harmony.luni.net.PlainSocketImpl.bind(PlainSocketImpl.java:190) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at java.net.Socket.startupSocket(Socket.java:777) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at java.net.Socket.tryAllAddresses(Socket.java:192) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at java.net.Socket.<init>(Socket.java:256) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at java.net.Socket.<init>(Socket.java:220) 
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):  at com.example.sockets.ReadSocket.run(ReadSocket.java:83) 

Quelqu'un pourrait-il me diriger dans la bonne direction pour que cela fonctionne? Peut-être que je devrais tester d'abord la connexion d'une certaine manière (si oui, s'il vous plaît dire comment?) Merci

Chris

Répondre

2

Pour commencer, supprimez l'appel récursif. Cela permettra de se débarrasser du débordement de la pile. Remplacez-le par une boucle et le sommeil à chaque itération sans succès

public void run() { 
    boolean connected = false; 
    while(!connected) 
    { 
    try { 
     smtpSocket = new Socket(address, 60001); 

      os = new DataOutputStream(smtpSocket.getOutputStream()); 
      is = new DataInputStream(smtpSocket.getInputStream()); 


     connected = true; 
    } catch (UnknownHostException e) { 
     System.err.println("Don't know about host: " + address); 

    } catch (IOException e) { 
     System.err.println("Couldn't get I/O for the connection to: " + address); 

     } catch (Exception e) { 
     System.out.println("retry"); 

     } 
     if (!connected) 
      Thread.sleep(1000) 
     } 
    } 
+0

Merci beaucoup. Je viens de comprendre ce que vous avez posté! Excusez mon idiot-ness = P. –

0

Vous pouvez isConnected() et isBound() sur votre prise pour vérifier wether vous êtes connecté ou non avant d'essayer d'obtenir un flux d'entrée.

+0

Merci pour la réponse! Cependant, cela entraîne toujours l'erreur de débordement. J'ai même essayé de supprimer complètement les flux d'E/S, mais l'erreur persistait. –

+0

la méthode 2 retourne vrai ??? parce que si ce n'est pas le cas, vous pouvez modifier votre gestion, ou définir un délai avant de répéter la tentative de connexion? – Sephy