package alma.logoot.network.p2p.utils; import java.io.IOException; import java.net.DatagramPacket; import java.net.URI; import java.net.URISyntaxException; import alma.logoot.network.p2p.interfaces.OnReceiveHandler; import net.jxta.document.AdvertisementFactory; import net.jxta.id.IDFactory; import net.jxta.pipe.PipeID; import net.jxta.pipe.PipeService; import net.jxta.platform.NetworkManager; import net.jxta.protocol.PipeAdvertisement; import net.jxta.socket.JxtaMulticastSocket; public class Receiver extends Thread { private boolean stop; private NetworkManager manager; private OnReceiveHandler handler = null; /* * According to the JXTA Specification 2.0, the 0-15 octets represent the * group UUID, and 16-31 octets represent peer UUID. 31-62 octets are not * used and the 63th octet is the ID type (03 for peer ID). */ public final static String SOCKETIDSTR = "urn:jxta:uuid-59616261646162614E5047205032503336E8699B341345449B7EE54AC8662A8604"; public Receiver(NetworkManager manager) { this.stop = false; this.manager = manager; } public Receiver(NetworkManager manager, OnReceiveHandler handler) { this.stop = false; this.manager = manager; this.handler = handler; } /** * Creates a Socket Pipe Advertisement with the pre-defined pipe ID * * @return a socket PipeAdvertisement */ public static PipeAdvertisement getSocketAdvertisement() { PipeID socketID = null; try { socketID = (PipeID) IDFactory.fromURI(new URI(SOCKETIDSTR)); } catch (URISyntaxException use) { use.printStackTrace(); } PipeAdvertisement advertisement = (PipeAdvertisement) AdvertisementFactory .newAdvertisement(PipeAdvertisement.getAdvertisementType()); advertisement.setPipeID(socketID); // set to type to propagate advertisement.setType(PipeService.PropagateType); advertisement.setName("Socket Logoot"); return advertisement; } @Override public void run() { JxtaMulticastSocket mcastSocket = null; try { mcastSocket = new JxtaMulticastSocket(manager.getNetPeerGroup(), getSocketAdvertisement()); } catch (IOException e) { e.printStackTrace(); System.exit(-1); } byte[] buffer = new byte[16384]; receive(mcastSocket, buffer); } /** * Receive method. When a message is received, the 'execute' method of the * handler is called with the received message. * * @param mcastSocket * the socket * @param buffer * the buffer */ private void receive(JxtaMulticastSocket mcastSocket, byte[] buffer) { while (!stop) { try { if (this.handler != null) { DatagramPacket packet = new DatagramPacket(buffer, buffer.length); // wait for a datagram. mcastSocket.receive(packet); String data = new String(packet.getData(), 0, packet.getLength()); this.handler.execute(data); // System.out.println("Received data from :" + // packet.getAddress()); // System.out.println(data); } } catch (IOException e) { receive(mcastSocket, buffer); } } } /** * Stop the receiver loop. */ public void stopReceiver() { this.stop = true; } public void setHandler(OnReceiveHandler handler) { this.handler = handler; } }