используя Controller.java, я реализую run () в NetworkDiscovery.java, который запрашивает все машины в подсети.Активные машины отвечают своим статусом.Это происходит через равные промежутки времени.
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();**
}
}
На стороне клиента аналогичный сокет дейтаграммы открывается и объекты принимаются / отправляются.
Проблема в том, что на стороне контроллера явыполняя функцию NetworkDiscovery run () через определенный промежуток времени и во время второго выполнения, он говорит -
java.net.BindException: адрес уже используется
Поскольку язакрывая сокет контроллера с помощью close (), почему он все еще показывает, что этот адрес уже используется?Как я могу убедиться, что во время следующей итерации контроллер запускается поверх нового вызова networkDiscovery?