2012-01-27 8 views
0

Mon application client doit être capable de récupérer dans plusieurs situations. À la mise sous tension, le client lit l'adresse et le port d'un fichier et tente de se connecter au serveur. Si c'est la première fois que ce client a été utilisé sur cet hôte, une adresse IP par défaut est essayée mais cela peut être incorrect. L'utilisateur doit ensuite entrer l'adresse IP correcte. Le port est codé en dur. La façon dont cela fonctionne est maintenant une seconde d'swing.Timer tente d'obtenir le statut du serveur ...Programmation robuste Java Socket

statusTimer = new Timer(ONE_SECOND, new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     final byte GET_STATUS = 20; 
     SendCommand(GET_STATUS, null); 
    } 
}); 
statusTimer.start(); 

S'il n'y a pas de connexion de l'utilisateur est invité à se connecter ...

private void SendCommand(byte command, byte[] parameters) { 
    if ((null == socket) || (null == outputStream) || socket.isClosed()) 
     if (JOptionPane.YES_OPTION == 
      JOptionPane.showConfirmDialog(null, "Connect?")) 
      Connect(); 
      ... 

private void Connect() { 
    String s = (String) 
     JOptionPane.showInputDialog(null, "Enter IP Address", ipAddress); 
    if (validateIp(s)) { 
     ipAddress = s; 
     connectTask = new ConnectTask(); 
     connectTask.start(); 
     ... 

Le socket est ouvert, les flux io sont définis et un RxThread est démarré.

class ConnectTask extends Thread { 
    @Override public void run() { 
     try { 
      if (null == socket) socket = new Socket(ipAddress, TCP_PORT); 
      if (null == outputStream) outputStream = socket.getOutputStream(); 
      if (null == inputStream) inputStream = socket.getInputStream(); 
      if (null == rxThread) rxThread = new RxThread(); 
      ... 

Il y a quelques mauvaises choses qui pourraient se produire à ce moment, par exemple:
1. Le serveur pourrait être lorsque le client est sous tension. Quelle est la meilleure façon pour le client d'ouvrir automatiquement le socket, de définir les flux io et de continuer lorsque le serveur est sous tension?
2. De la même manière, le serveur peut voir un cycle d'alimentation pendant une lecture, une écriture ou aucune. Y at-il un bon moyen de récupérer automatiquement après le rétablissement du courant?
3. L'adresse IP peut devoir être corrigée comme mentionné ci-dessus.
Ce serait bien de gérer ces situations et d'autres sans que l'utilisateur doive fermer et ouvrir l'application client ou mettre le système sous tension. Quels types d'approches sont nécessaires pour une socket client java pare-balles?
This et this sont similaires mais beaucoup avec les sockets serveur

Répondre

1

Vous devez être en mesure de faire la distinction entre l'utilisation pour la première fois (lorsque les détails du serveur peuvent être erronés, et l'utilisateur doit être invité) et une utilisation ultérieure (lorsque le serveur peut juste être en panne). Vous pouvez enregistrer un fichier lorsque l'utilisateur entre d'abord l'adresse IP, par exemple. Après cela, vous voulez probablement quelque chose comme: une boucle interne où vous essayez de vous connecter au serveur et lire des données, avec un délai d'expiration. Si le socket est fermé en raison d'une erreur réseau, cela peut être détecté avec un bloc try-catch. Mettez tout cela dans une boucle externe de sorte que vous réessayez une fois déconnecté. En fonction des détails, et en supposant que la quantité de données est petite, il peut être plus facile pour votre client d'ouvrir une connexion à chaque fois plutôt que d'essayer de maintenir une connexion, puis de dormir entre les connexions. Si le serveur ne répond pas, votre code actuel (qui crée un nouveau thread ConnectTask chaque seconde en utilisant une minuterie) peut créer plusieurs ConnectTasks, un créé par seconde, essayant chacun de se connecter en parallèle, bien qu'il soit difficile d'être certain du code partiel que vous avez posté.