package net.gcdc; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketAddress; import java.net.SocketException; import java.util.ArrayList; import java.util.Arrays; public class UdpDuplicator { private static final Logger LOGGER = LoggerFactory.getLogger(UdpDuplicator.class); private class Client implements Runnable { public final int localPort; public final SocketAddress remoteAddress; public final DatagramSocket socket; public Client(int localPort, SocketAddress remoteAddress) throws SocketException { this.localPort = localPort; this.remoteAddress = remoteAddress; this.socket = new DatagramSocket(this.localPort); } public void send(byte[] payload) throws IOException { socket.send(new DatagramPacket(payload, payload.length, remoteAddress)); } @Override public void run() { int length = 3000; byte[] buffer = new byte[length]; DatagramPacket packet = new DatagramPacket(buffer, length); try { while (true) { socket.receive(packet); byte[] payload = Arrays.copyOfRange(packet.getData(), 0, packet.getLength()); sendAll(payload); } } catch (IOException e) { // TODO Auto-generated catch block LOGGER.info("packetsending or receiving error ", e); } } } private final ArrayList<Client> clients = new ArrayList<>(); public UdpDuplicator() { } public void sendAll(byte[] payload) throws IOException { for (Client c : clients) { c.send(payload); } } public void add(int localPort, SocketAddress remoteAddress) throws SocketException { Client c = new Client(localPort, remoteAddress); (new Thread(c)).start(); clients.add(c); } }