Skip to content

Instantly share code, notes, and snippets.

@HenokT
Last active December 30, 2015 06:39
Show Gist options
  • Save HenokT/7790661 to your computer and use it in GitHub Desktop.
Save HenokT/7790661 to your computer and use it in GitHub Desktop.
A Generic UDP Listener that can be configured to listen to UDP messages on any port and pass the messages to a MessageHandler<T> instance for processing .The default packet bufferSize can be overridden by using the constructor that takes a bufferSize argument.
package com.yourcompany.util;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.concurrent.Executor;
public class GenericUdpListener implements Runnable
{
private static final int ZERO = 0;
private int port;
private int bufferSize = 65536; // default buffer size = 2^16
private Executor executor;
private MessageHandler<byte[]> messageHandler;
public GenericUdpListener(int port, Executor executor, MessageHandler<byte[]> messageHandler)
{
this.port = port;
this.executor = executor;
this.messageHandler = messageHandler;
}
protected GenericUdpListener(int port, int bufferSize, Executor executor,
MessageHandler<byte[]> messageHandler)
{
this(port, executor, messageHandler);
this.bufferSize = bufferSize;
}
@Override
public void run()
{
DatagramSocket socket = null;
try
{
socket = new DatagramSocket(port);
byte[] buffer = new byte[bufferSize];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
LogUtil.LOG.info(String.format("Listening on Port: %s", port));
while (true)
{
socket.receive(packet);
final byte[] receivedBytes = new byte[packet.getLength()];
System.arraycopy(packet.getData(), ZERO, receivedBytes, ZERO, receivedBytes.length);
executor.execute(new Runnable()
{
@Override
public void run()
{
messageHandler.handleMessage(receivedBytes);
}
});
}
}
catch (Exception e)
{
LOG.error("", e);
}
finally
{
if (socket != null)
{
try
{
socket.close();
}
catch (Exception e)
{
LOG.error("", e);
}
}
}
}
}
package com.yourcompany.util;
public interface MessageHandler<T>
{
void handleMessage(T message);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment