Java中的服务器客户端程序

Java中的服务器客户端程序,java,client,Java,Client,我正在实现一个程序,其中控制器(服务器)定期调用代理(客户端)并将其发送到IP地址 Controller.java public class Controller { static int discoveryInterval; NetworkDiscovery n1; Controller(){ discoveryInterval=6000; } public static void main(String[] arg

我正在实现一个程序,其中控制器(服务器)定期调用代理(客户端)并将其发送到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();
}
}

当我运行控制器(服务器)时,代理(客户端)端只执行一次,尽管控制器仍在侦听。而且,如果我重新运行代理,什么也不会发生。有人能帮我吗?

如果你看一下这里的计划方法的定义:

您可以看到,只有一个长参数的方法只执行一次。 你要找的是有两个长参数的。这将等待延迟ms,然后每隔周期执行一次

您正在使用的一个将仅在延迟毫秒后执行一次


您可能还希望查看使用非阻塞io(java.nio.*)接收连接或使用接收超时。这样,您就不会同时运行多个线程。

1)要更快地获得更好的帮助,请发布一个。2) 请在代码中使用缩进。缩进有助于提高可读性。@Andrew Thompson-当然,我会马上编辑它。编辑的时候很好。不幸的是:1)理想情况下,SSCCE应该是单个源文件。2) 这对于服务器/客户机设置来说很棘手(但并非不可能),最好链接到最新版本的JavaDocs。有关如何获取该链接的提示,请参阅。我的朋友,没有意识到这是一个旧链接。该提示涉及使用Google查找JavaDoc链接。你读过吗?我读过,但当我第一次得到链接时,我关心的是回答这个问题,而不是javadoc对于那个类的更新程度。像这样的类很少更改。@xthexter-I在服务器端实现scheduleAtFixedRate(),在客户端也需要做同样的事情。但是我如何同步它们呢?欢迎任何指点。