summaryrefslogtreecommitdiff
path: root/same/src/main/java/com/orbekk/same/discovery/DiscoveryService.java
blob: a1147cc149c31938ca2238ed69a307ea63864a45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.orbekk.same.discovery;

import java.net.DatagramPacket;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.orbekk.net.BroadcastListener;

public class DiscoveryService extends Thread {
    private Logger logger = LoggerFactory.getLogger(getClass());
    BroadcastListener broadcastListener;
    DiscoveryListener listener;

    public DiscoveryService(DiscoveryListener listener,
            BroadcastListener broadcastListener) {
        this.listener = listener;
        this.broadcastListener = broadcastListener;
    }

    @Override
    public void run() {
        logger.info("DiscoveryService starting.");
        while (!Thread.interrupted()) {
            DatagramPacket packet = broadcastListener.listen();
            if (packet == null) {
                // An error or interrupt occurred.
                continue;
            }
            String content = new String(packet.getData(), 0, packet.getLength());
            String[] words = content.split(" ");

            if (!content.startsWith("Discover") || words.length < 2) {
                logger.warn("Invalid discovery message: {}", content);
                continue;
            }

            String url = words[1];
            logger.info("Received discovery from {}", url);
            if (listener != null) {
                listener.discover(url);
            }
        }
        logger.info("DiscoveryService stopped.");
    }

    @Override public void interrupt() {
        logger.info("Interrupt()");
        super.interrupt();
        broadcastListener.interrupt();
    }
}