定期查询客户端以通过套接字进行更新 - 重用端口

时间:2011-10-03 13:45:19

标签: java sockets timer

使用Controller.java,我在NetworkDiscovery.java中实现run(),它查询子网中的所有机器。活动机器回复其状态。这种情况会定期发生。

public class Controller {
NetworkDiscovery n;
public static int discoveryInterval=2000;
PM pmList;
List pmlist=(List) new PM();

public static void main(String[] args) throws UnknownHostException{
Timer t1=new Timer();
t1.scheduleAtFixedRate(new NetworkDiscovery(), 2000, discoveryInterval);
}

public class NetworkDiscovery extends TimerTask{

InetAddress controllerIP;
int controllerPort;

NetworkDiscovery() throws UnknownHostException {
    controllerIP=InetAddress.getLocalHost();
    controllerPort=4455;
}

@Override
public void run() {
    try {
        byte[] recvBuf = new byte[5000];
        DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
        DatagramSocket dSock = new DatagramSocket(4445);
        dSock.receive(packet);
//implementation related code follows
**dSock.close();**
}
}

在客户端,打开一个类似的数据报套接字并接收/发送对象。

问题是在COntroller方面,我在特定时间间隔后执行NetworkDiscovery的run(),在第二次执行期间,它说 -

  

java.net.BindException:已在使用的地址

由于我正在通过close()关闭Controller的套接字,为什么它仍然显示该地址已被使用?如何确保在下一次迭代期间,控制器重新开始调用networkDiscovery?

1 个答案:

答案 0 :(得分:1)

也许第二个任务在第一个任务完全执行之前就开始了?您是否尝试插入调试消息并查看第一个任务是否已完成?