2017-07-13 2 views
0

Je travaille sur une des applications de socket à base UDP, et ici j'ai eu quelques questions sur la façon de mettre en œuvre la fonction écouter sur réception côtéMulticastSocket garder écouter la fonction

  1. Voici une bonne façon de laisser le côté réception socket pour continuer à écouter le côté serveur? Supposons que je ne sache pas quand le côté serveur enverra le paquet à recevoir, donc je dois garder la fonction de réception toujours active. Va-t-il manquer ou comment casser la boucle while (true)? Si oui, comment "reconnecter" et rendre la boucle d'écoute encore vivante?

    while(true){ 
    
        try{ 
        if (udpsocket_receiving.isClosed() || !udpsocket_receiving.isConnected()) { 
    
          serverAddress = InetAddress.getByName(SERVERIP); 
          udpsocket_receiving = new MulticastSocket(SERVERPORT) ; 
          udpsocket_receiving.joinGroup(serverAddress); 
          udpsocket_receiving.setSoTimeout(10000); 
         } 
         udpsocket_receiving.receive(recpacket); 
         // Block of code to do with the packet 
    
        } catch (SocketTimeoutException e) { 
         // What suppose to do here if I catch this exception? 
        } finally { 
         udpsocket_receiving.close(); 
         continue; 
        } 
    } 
    
  2. ci-dessus peut résoudre méthode déjà si je n'ai pas accès à Internet pour un certain temps, supposons que la méthode sera toujours prendre à droite SocketTimeoutException? Mais quand l'accès Internet reprendra plus tard, puis-je continuer à écouter quand le paquet arrive? Supposons que je reçois le premier paquet du côté de l'expéditeur et que j'exécute le code, mais que le côté expéditeur envoie un second paquet à ce moment-là, le paquet me manquera-t-il? Puisque la boucle while sur le premier paquet n'est pas fin.

  3. Est-ce que vous pouvez fermer manuellement le socket et le rebrancher? Est-ce qu'il liera le port et ne pourra plus utiliser ce port pour un nouvel objet? dois-je mettre ceux à l'intérieur du SocketTimeoutException en question un?

    udpsocket_receiving.leaveGroup(serverAddress); 
        udpsocket_receiving.disconnect(); 
        udpsocket_receiving.close(); 
        udpsocket_receiving = new MulticastSocket(SERVERPORT) ; 
        udpsocket_receiving.setSoTimeout(10000); 
        udpsocket_receiving.joinGroup(serverAddress); 
    

Répondre

1

non, vous n'êtes jamais connectez la prise, donc dpsocket_receiving.isConnected() ne sera jamais vrai. Vous n'avez pas besoin de tout ça fermé/ouvert à l'intérieur du non-sens lire la boucle.La seule personne qui va jamais fermer le socket est vous.Le SocketTimeoutException signifie qu'aucun datagramme n'a été eceived dans la période de timeout de lecture. Ce que vous faites à ce sujet dépend de vous, peut-être rien, mais cela ne signifie pas que vous devez fermer et réinitialiser le socket. Refaire tout cela ne résoudra pas un problème de connectivité Internet. La seule façon de manquer normalement les paquets est de les laisser tomber, mais la fermeture et la réouverture du socket fournissent une fenêtre dans laquelle cela se produira. Ne fais pas ça. Lors de la fermeture du socket, il suffit de le fermer. Laisser tous ses groupes de multidiffusion est automatique, tout comme la déconnexion, et comme vous ne l'avez jamais connecté, il n'était pas nécessaire de le déconnecter dans la première phase.

+0

Merci pour la réponse, donc en fonction de votre commentaire, j'ai juste besoin de retirer le bloc finally de la boucle while, et déplacer le code d'initialisation à un endroit qui ne fonctionne qu'une seule fois, ai-je raison? – Sean

+0

aussi, comme vous l'avez dit Redoing tout cela ne résoudra pas un problème de connectivité Internet, donc si une fois la connectivité Internet est supprimée, le socket ne sera plus écouter même si la connectivité est de retour? – Sean

+0

La socket reste valide quelle que soit la connectivité Internet à venir et à venir. – EJP