Периодически запрашивать у клиента обновления через сокеты-Повторное использование портов - PullRequest
0 голосов
/ 03 октября 2011

используя 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?

1 Ответ

1 голос
/ 03 октября 2011

Может быть, вторая задача начинается до того, как первая была выполнена полностью? Вы пытались вставить отладочные сообщения и посмотреть, было ли выполнено первое задание?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...