2011-10-01 4 views
0

J'implémente un programme dans lequel le contrôleur (serveur) appelle périodiquement l'agent (client) et lui envoie l'adresse IP.Programme client client en Java

Controller.java

public class Controller { 
     static int discoveryInterval; 
     NetworkDiscovery n1; 

    Controller(){   
     discoveryInterval=6000; 
} 
public static void main(String[] args) throws IOException { 
     Timer t1=new Timer(); 
     t1.schedule(new NetworkDiscovery(), discoveryInterval); 
} 
} 

NetworkDiscovery.java-

import java.io.*; 
public class NetworkDiscovery extends TimerTask { 
     protected DatagramSocket socket = null; 
     protected BufferedReader in = null; 

     public NetworkDiscovery() throws IOException { 
       this("NetworkDiscovery"); 
     } 
public NetworkDiscovery(String name) throws IOException { 
     super(name); 
     socket = new DatagramSocket(4445); 
} 

public void run() { 
     try { 
     byte[] buf = new byte[256]; 

     // receive request 
     DatagramPacket packet = new DatagramPacket(buf, buf.length); 
     socket.receive(packet); 

     // figure out response 
     String dString = InetAddress.getLocalHost().toString(); 
     buf = dString.getBytes(); 

     // send the response to the client at "address" and "port" 
     InetAddress address = packet.getAddress(); 
     int port = packet.getPort(); 

     packet = new DatagramPacket(buf, buf.length, address, port); 
     socket.send(packet); 
} catch (IOException e) { 
     e.printStackTrace(); 
} 
socket.close(); 
} 
} 

l'agent (côté du client) - Agent.java

public class Agent { 
     ackDiscovery ackDisc=new ackDiscovery(); 
     public static void main(String[] args) throws SocketException,UnknownHostException,IOException { 
      ackDiscovery ackDisc=new ackDiscovery(); 
      ackDisc.ackInfo(); 
      } 
} 

Et ackDiscovery.java-

public class ackDiscovery { 
      int agentListenPort; 
      void ackDiscovery(){ 
         agentListenPort=4455; 
} 

public void ackInfo() throws SocketException, UnknownHostException, IOException{ 
       // get a datagram socket 
       DatagramSocket socket = new DatagramSocket(); 

       // send request 
       byte[] buf = new byte[256]; 
       InetAddress address = InetAddress.getByName(MY_IP); 
       DatagramPacket packet = new DatagramPacket(buf, buf.length, address,  4445); 
       socket.send(packet); 
       // get response 
       packet = new DatagramPacket(buf, buf.length); 
       socket.receive(packet); 

       // display response 
       String received = new String(packet.getData()); 
       System.out.println("Data received:"+ received); 
       socket.close(); 
} 
} 

Lorsque j'exécute le contrôleur (serveur), le côté de l'agent (client) n'est exécuté qu'une seule fois si le contrôleur est toujours en écoute. De plus, si je relance l'agent, rien ne se passe. Quelqu'un peut-il m'aider s'il vous plaît?

+4

1) Pour une meilleure aide plus rapidement, postez un [SSCCE] (http://pscode.org/sscce.html). 2) Veuillez utiliser l'indentation dans le code. L'indentation aide à la lisibilité. –

+0

@Andrew Thompson- Bien sûr, je vais le modifier tout de suite. –

+0

Bon appel sur l'édition. Malheureusement: 1) Un SSCCE devrait idéalement être un fichier source unique. 2) C'est compliqué à faire avec une configuration serveur/client (mais pas impossible). –

Répondre

2

Si vous regardez les définitions de la méthode de calendrier ici:

http://download.oracle.com/javase/7/docs/api/java/util/Timer.html

Vous pouvez voir que la méthode avec un paramètre unique à long, n'exécutera une fois. Ce que vous cherchez est celui avec deux longs paramètres. Cela attendra le délai ms et ensuite exécuter chaque période ms.

Celui que vous utilisez n'exécutera qu'une seule fois après délai ms.

Vous pouvez également utiliser l'option io (java.nio. *) Non bloquante pour recevoir des connexions ou utiliser un délai d'attente de réception. De cette façon, plusieurs threads ne s'exécuteront pas simultanément.

+0

Il est préférable de créer un lien vers la dernière version de JavaDocs. Voir [point 2] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7090875) pour obtenir des conseils sur la façon d'obtenir ce lien. –

+0

Mon mauvais, ne s'est pas rendu compte que c'était un vieux lien. – xthexder

+0

Le conseil consiste à rechercher des liens JavaDoc à l'aide de Google. Est-ce que vous l'avez vu? –