使用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?
答案 0 :(得分:1)
也许第二个任务在第一个任务完全执行之前就开始了?您是否尝试插入调试消息并查看第一个任务是否已完成?