2011-10-01 38 views
0

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

在代理(客户端) - 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(); 
} 
} 

当我运行控制器(服务器)时,虽然Controller仍在监听,但Agent的(客户端)端只执行一次。另外,如果我重新运行代理,则不会发生任何事情。有人可以帮帮我吗?

+4

1)为了更快地获得更好的帮助,请发布[SSCCE](http://pscode.org/sscce.html)。 2)请在代码中使用缩进。缩进有助于可读性。 –

+0

@安德鲁汤普森 - 当然,我会马上编辑它。 –

+0

良好的编辑呼叫。不幸的是:1)理想情况下,SSCCE应该是单个源文件。 2)这对于服务器/客户端设置来说很棘手(但并非不可能)。 –

回答

2

如果你看看这里的调度方法的定义:

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

你可以看到,一个长参数的方法,将只执行一次。 你正在寻找的是两个长参数。这将等待延迟毫秒,然后执行每个周期毫秒。

您正在使用的那个将只会在延迟毫秒后执行一次。

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

+0

最好链接到最新版本的JavaDocs。有关如何获取该链接的提示,请参阅[第2点](http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7090875)。 –

+0

我的坏,没有意识到这是一个旧的联系。 – xthexder

+0

提示涉及使用Google查找JavaDoc链接。你读过它吗? –