2011-10-01 31 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鏈接。你讀過它嗎? –