使用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()关闭控制器的套接字,为什么它仍然显示该地址已被使用?如何确保在下一次迭代期间,控制器重新启动networkDiscovery的调用?

最佳答案

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

关于java - 通过套接字定期查询客户端以进行更新-重用端口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7635844/

10-11 22:25
查看更多