summaryrefslogtreecommitdiff
path: root/same/src/main/java/com/orbekk/net/BroadcastListener.java
blob: 50ad5af5a44e0b83c7c5c9d48182f8ad7b286d06 (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
53
54
55
56
57
58
59
60
61
62
package com.orbekk.net;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

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

public class BroadcastListener {
    private int port;
    private Logger logger = LoggerFactory.getLogger(getClass());
    DatagramSocket socket;
    
    public BroadcastListener(int port) {
        this.port = port;
    }
    
    public synchronized DatagramPacket listen() {
        logger.debug("Waiting for broadcast on port " + port);
        try {
            if (socket == null) {
                socket = new DatagramSocket(null);
                socket.setReuseAddress(true);
                socket.bind(new InetSocketAddress(port));
            }
        } catch (SocketException e) {
            logger.warn("Failed to create socket.", e.fillInStackTrace());
            return null;
        }
        try {
            socket.setBroadcast(true);
        } catch (SocketException e) {
            logger.warn("Exception: {}", e);
        }
        byte[] buffer = new byte[2048];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        try {
            socket.receive(packet);
        } catch (IOException e) {
            logger.warn("Exception when listening for broadcast: {}", e);
            return null;
        }
        
        String address = packet.getAddress().getHostAddress();
        logger.debug("Received broadcast from " + address +
                ": " + new String(packet.getData(), 0, packet.getLength()));
        return packet;
    }
    
    public void interrupt() {
        socket.close();
    }
    
    public static void main(String[] args) {
        int port = Integer.parseInt(args[0]);
        BroadcastListener listener = new BroadcastListener(port);
        System.out.println("Received broadcast: " + listener.listen());
    }
}