Клиентская программа сервера на Java - PullRequest
0 голосов
/ 01 октября 2011

Я реализую программу, в которой контроллер (сервер) периодически вызывает агента (клиента) и отправляет ему IP-адрес.

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();
}
}

На агенте (на стороне клиента) - 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();
             }
}

И 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();
}
}

Когда я запускаю контроллер (сервер), сторона агента (клиента) выполняется только один раз, хотя контроллер все еще слушает.Также, если я перезапущу агента, ничего не произойдет.Может кто-нибудь, пожалуйста, помогите мне?

1 Ответ

2 голосов
/ 01 октября 2011

Если посмотреть на определения метода расписания здесь:

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

Вы можете видеть, что метод с одним длинным параметром будет выполняться только один раз.То, что вы ищете, это тот, с двумя длинными параметрами.Это будет ожидать задержка мс и затем выполняться каждый период мс.

Используемая вами программа будет выполняться только один раз после задержка мс.

Вы также можете захотеть использовать неблокирующую io (java.nio. *) Для получения соединений или тайм-аут приема.Таким образом, вы не будете запускать несколько потоков одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...