410 likes | 517 Vues
Learn how to send messages between peers using JXTA technology, create input/output pipes, and handle message events with detailed examples and code snippets.
E N D
Programming with JXTA • Sending Messages Between two Peers • JxtaBiDiPipe • JxtaSockets
Programming with JXTA Devono avere home directory diverse • Sending Messages Between two Peers • Due programmi • Pipe Listner • Crea una input pipe (usando l’advertisement examplepipe.adv) • Pubblica l’advertisement della pipe (nell’esempio assumiamo che l’advertisement è stato inviato precedentemente) • Attende messaggi • Pipe Example • Crea una output pipe (usando l’advertisement examplepipe.adv) • Invia un messaggio
Programming with JXTA import java.io.FileInputStream; import java.util.Date; import java.util.Enumeration; import net.jxta.document.AdvertisementFactory; import net.jxta.document.MimeMediaType; import net.jxta.endpoint.Message; import net.jxta.endpoint.MessageElement; import net.jxta.endpoint.WireFormatMessage; import net.jxta.endpoint.WireFormatMessageFactory; import net.jxta.endpoint.Message.ElementIterator; import net.jxta.exception.PeerGroupException; import net.jxta.peergroup.PeerGroup; import net.jxta.peergroup.PeerGroupFactory; import net.jxta.pipe.InputPipe; import net.jxta.pipe.PipeMsgEvent; import net.jxta.pipe.PipeMsgListener; import net.jxta.pipe.PipeService; import net.jxta.protocol.PipeAdvertisement; import net.jxta.util.CountingOutputStream; import net.jxta.util.DevNullOutputStream; Pipe Listner public class PipeListener implements PipeMsgListener { static PeerGroup netPeerGroup = null; private PipeService pipe; private PipeAdvertisement pipeAdv; private InputPipe pipeIn = null; private final static String SenderMessage = "PipeListenerMsg"; public static void main(String args[]) { PipeListener myapp = new PipeListener(); myapp.startJxta(); myapp.run(); }
Programming with JXTA private void startJxta() { try { netPeerGroup=PeerGroupFactory.newNetPeerGroup(); } catch (PeerGroupException e) { System.out.println("fatal error : group creation failure"); e.printStackTrace(); System.exit(1); } pipe = netPeerGroup.getPipeService(); System.out.println("Reading in pipexample.adv"); try { FileInputStream is = new FileInputStream("pipexample.adv"); pipeAdv = (PipeAdvertisement) AdvertisementFactory.newAdvertisement(MimeMediaType.XMLUTF8, is); is.close(); } catch (Exception e) { System.out.println("failed to read/parse pipe advertisement"); e.printStackTrace(); System.exit(-1); } } Pipe Listner
Programming with JXTA public void run() { try { System.out.println("Creating input pipe"); pipeIn = pipe.createInputPipe(pipeAdv, this); } catch (Exception e) { return; } if (pipeIn == null) { System.out.println(" cannot open InputPipe"); System.exit(-1); } System.out.println("Waiting for msgs on input pipe"); } Pipe Listner
Programming with JXTA public void pipeMsgEvent(PipeMsgEvent event) { Message msg=null; try {// grab the message from the event msg = event.getMessage(); if (msg == null) { return; } printMessageStats(msg, true); } catch (Exception e) { e.printStackTrace(); return; } // get all the message elements Message.ElementIterator en = msg.getMessageElements(); if (!en.hasNext()) { return; } // get the message element named SenderMessage MessageElement msgElement = msg.getMessageElement(null, SenderMessage); // Get message if (msgElement.toString() == null) { System.out.println("null msg received"); } else { Date date = new Date(System.currentTimeMillis()); System.out.println("Message received at :"+ date.toString()); System.out.println("Message created at :"+ msgElement.toString()); } } Pipe Listner namespace
Programming with JXTA public static void printMessageStats(Message msg, boolean verbose) { try { CountingOutputStream cnt; ElementIterator it = msg.getMessageElements(); System.out.println("------------------Begin Message---------------------"); WireFormatMessage serialed = WireFormatMessageFactory.toWire( msg, new MimeMediaType("application/x-jxta-msg"), (MimeMediaType[]) null); System.out.println("Message Size :" + serialed.getByteLength()); while (it.hasNext()) { MessageElement el = (MessageElement) it.next(); String eName = el.getElementName(); cnt = new CountingOutputStream(new DevNullOutputStream()); el.sendToStream(cnt); long size = cnt.getBytesWritten(); System.out.println("Element " + eName + " : " + size); if (verbose) { System.out.println("["+el+"]"); } } System.out.println("-------------------End Message----------------------"); } catch (Exception e) { System.out.println("Errore"); e.printStackTrace(); } } Pipe Listner
Programming with JXTA import java.io.FileInputStream; import java.io.IOException; import java.util.Date; import net.jxta.discovery.DiscoveryService; import net.jxta.document.AdvertisementFactory; import net.jxta.document.MimeMediaType; import net.jxta.endpoint.Message; import net.jxta.endpoint.StringMessageElement; import net.jxta.exception.PeerGroupException; import net.jxta.peergroup.PeerGroup; import net.jxta.peergroup.PeerGroupFactory; import net.jxta.pipe.OutputPipe; import net.jxta.pipe.OutputPipeEvent; import net.jxta.pipe.OutputPipeListener; import net.jxta.pipe.PipeService; import net.jxta.protocol.PipeAdvertisement; import net.jxta.rendezvous.RendezvousEvent; import net.jxta.rendezvous.RendezvousListener; import net.jxta.rendezvous.RendezVousService; PipeExample public class PipeExample implements Runnable, OutputPipeListener, RendezvousListener { static PeerGroup netPeerGroup = null; private final static String SenderMessage = "PipeListenerMsg"; private PipeService pipe; private DiscoveryService discovery; private PipeAdvertisement pipeAdv; private RendezVousService rendezvous; public static void main(String args[]) { PipeExample myapp = new PipeExample(); myapp.startJxta(); myapp.run(); }
Programming with JXTA private void startJxta() { try { // create, and Start the default jxta NetPeerGroup netPeerGroup = PeerGroupFactory.newNetPeerGroup(); rendezvous = netPeerGroup.getRendezVousService(); rendezvous.addListener(this); } catch (PeerGroupException e) { // could not instantiate the group, print the stack and exit System.out.println("fatal error : group creation failure"); e.printStackTrace(); System.exit(-1); } // get the pipe service, and discovery pipe = netPeerGroup.getPipeService(); discovery = netPeerGroup.getDiscoveryService(); System.out.println("Reading in pipexample.adv"); try { FileInputStream is = new FileInputStream("pipexample.adv"); pipeAdv = (PipeAdvertisement) AdvertisementFactory.newAdvertisement(MimeMediaType.XMLUTF8, is); is.close(); } catch (Exception e) { System.out.println("failed to read/parse pipe advertisement"); e.printStackTrace(); System.exit(-1); } } PipeExample
Programming with JXTA public synchronized void run() { try { // this step helps when running standalone (local sub-net without any redezvous setup) discovery.getRemoteAdvertisements(null, DiscoveryService.ADV, null, null, 1, null); // create output pipe with asynchronously // Send out the first pipe resolve call System.out.println("Attempting to create a OutputPipe"); pipe.createOutputPipe(pipeAdv, this); // send out a second pipe resolution after we connect to a rendezvous if (!rendezvous.isConnectedToRendezVous()) { System.out.println("Waiting for Rendezvous Connection"); try { wait(); System.out.println("Connected to Rendezvous, attempting to create a OutputPipe"); pipe.createOutputPipe(pipeAdv, this); } catch (InterruptedException e) { // got our notification } } } catch (IOException e) { System.out.println("OutputPipe creation failure"); e.printStackTrace(); System.exit(-1); } } PipeExample
Programming with JXTA public void outputPipeEvent(OutputPipeEvent event) { System.out.println(" Got an output pipe event"); OutputPipe op = event.getOutputPipe(); Message msg = null; try { System.out.println("Sending message"); msg = new Message(); Date date = new Date(System.currentTimeMillis()); StringMessageElement sme = new StringMessageElement(SenderMessage, date.toString() , null); msg.addMessageElement(null, sme); op.send(msg); } catch (IOException e) { System.out.println("failed to send message"); e.printStackTrace(); System.exit(-1); } op.close(); System.out.println("message sent"); } PipeExample
Programming with JXTA public synchronized void rendezvousEvent(RendezvousEvent event) { if (event.getType() == event.RDVCONNECT || event.getType() == event.RDVRECONNECT ) { notify(); } } Thread (metodo run()) PipeExample
Demo • Sending Messages Between two Peers
Programming with JXTA • JxtaBiDiPipe • JxtaServerPipe definisce una serie di metodi • bind: lega la pipe al gruppo • connect: connette la pipe al JxtaServerPipe • setPipeTimeout • setReliable • setListner • sendMessage • getMessage
Programming with JXTA Devono avere home directory diverse • JxtaBiDiPipe • Due programmi • JxtaServerPipeExample • Crea una bidi pipe (usando l’advertisement pipe.adv) • Pubblica l’advertisement della pipe (nell’esempio assumiamo che l’advertisement è stato inviato precedentemente) • Attende messaggi • JxtaBiDiPipeExample • Si connette alla pipe e riceve 100 messaggi
Programming with JXTA JxtaServerPipeExample import java.io.File; import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Date; import net.jxta.credential.AuthenticationCredential; import net.jxta.credential.Credential; import net.jxta.document.AdvertisementFactory; import net.jxta.document.MimeMediaType; import net.jxta.endpoint.Message; import net.jxta.endpoint.MessageElement; import net.jxta.endpoint.Messenger; import net.jxta.endpoint.StringMessageElement; import net.jxta.exception.PeerGroupException; import net.jxta.membership.InteractiveAuthenticator; import net.jxta.membership.MembershipService; import net.jxta.peergroup.PeerGroup; import net.jxta.peergroup.PeerGroupFactory; import net.jxta.protocol.PipeAdvertisement; import net.jxta.util.JxtaBiDiPipe; import net.jxta.util.JxtaServerPipe; import net.jxta.document.MimeMediaType; import net.jxta.document.StructuredDocument; import net.jxta.impl.protocol.PlatformConfig; import org.apache.log4j.Logger;
Programming with JXTA public class JxtaServerPipeExample { public static final int ITERATIONS = 100; private PeerGroup netPeerGroup = null; private PipeAdvertisement pipeAdv; private JxtaServerPipe serverPipe; private static final MimeMediaType MEDIA_TYPE = new MimeMediaType("application/bin"); private final static Logger LOG = Logger.getLogger(JxtaServerPipeExample.class.getName()); private final static String SenderMessage = "pipe_tutorial"; public static void main(String args[]) { JxtaServerPipeExample eg = new JxtaServerPipeExample(); eg.startJxta(); System.out.println("Reading in pipe.adv"); try { FileInputStream is = new FileInputStream("pipe.adv"); eg.pipeAdv = (PipeAdvertisement) AdvertisementFactory.newAdvertisement(MimeMediaType.XMLUTF8, is); is.close(); eg.serverPipe = new JxtaServerPipe(eg.netPeerGroup, eg.pipeAdv); eg.serverPipe.setPipeTimeout(0); // we want to block until a connection is established } catch (Exception e) { System.out.println("failed to bind to the JxtaServerPipe due to the following exception"); e.printStackTrace(); System.exit(-1); } eg.run(); } JxtaServerPipeExample
Programming with JXTA private void startJxta() { try { System.setProperty("net.jxta.tls.principal", "server"); System.setProperty("net.jxta.tls.password", "password"); System.setProperty("JXTA_HOME", System.getProperty("JXTA_HOME", "server")); File home = new File(System.getProperty("JXTA_HOME", "server")); if (!configured(home)) { createConfig(home, "JxtaServerPipeExample", true); } // create, and Start the default jxta NetPeerGroup netPeerGroup = PeerGroupFactory.newNetPeerGroup(); JxtaBidiPipeExample.login(netPeerGroup, "server", "password"); } catch (PeerGroupException e) { System.out.println("fatal error : group creation failure"); e.printStackTrace(); System.exit(1); } } JxtaServerPipeExample
Programming with JXTA JxtaServerPipeExample public void run() { System.out.println("Waiting for JxtaBidiPipe connections on JxtaServerPipe"); while (true) { try { JxtaBiDiPipe bipipe = serverPipe.accept(); if (bipipe != null ) { System.out.println("JxtaBidiPipe accepted, sending 100 messages to the other end") //Send a 100 messages sendTestMessages(bipipe); } } catch (Exception e) { e.printStackTrace(); return; } } } private void sendTestMessages(JxtaBiDiPipe pipe) { try { for (int i =0; i<ITERATIONS; i++) { Message msg = new Message(); String data = "Message #"+i; msg.addMessageElement(SenderMessage, new StringMessageElement(SenderMessage, data, null)); System.out.println("Sending :"+data); pipe.sendMessage(msg); //Thread.sleep(100); } } catch (Exception ie) { ie.printStackTrace(); } }
Programming with JXTA JxtaServerPipeExample protected static InputStream getResourceInputStream(String resource) throws IOException { ClassLoader cl = JxtaServerPipeExample.class.getClassLoader(); return cl.getResourceAsStream(resource); } protected static boolean configured(File home) { File platformConfig = new File(home, "PlatformConfig"); return platformConfig.exists(); } protected static void createConfig(File home, String name, boolean server) { try { String fname = null; if (server) { fname = "ServerPlatformConfig.master"; } else { fname = "PlatformConfig.master“ } InputStream is = getResourceInputStream(fname); home.mkdirs(); PlatformConfig platformConfig = (PlatformConfig) AdvertisementFactory.newAdvertisement(MimeMediaType.XMLUTF8, is); is.close(); platformConfig.setName(name); File newConfig = new File(home, "PlatformConfig"); OutputStream op = new FileOutputStream(newConfig); StructuredDocument doc = (StructuredDocument) platformConfig.getDocument(MimeMediaType.XMLUTF8); doc.sendToStream(op); op.close(); } catch (IOException e) { e.printStackTrace(); } }
Programming with JXTA JxtaBidiPipeExample public class JxtaBidiPipeExample implements PipeMsgListener, RendezvousListener { private PeerGroup netPeerGroup = null; private PipeAdvertisement pipeAdv; private JxtaBiDiPipe pipe; private RendezVousService rendezvous; private final static String SenderMessage = "pipe_tutorial"; private final static String completeLock = "completeLock"; private int count = 0; private final static Logger LOG = Logger.getLogger(JxtaBidiPipeExample.class.getName()); private void startJxta() { try { System.setProperty("net.jxta.tls.principal", "client"); System.setProperty("net.jxta.tls.password", "password"); System.setProperty("JXTA_HOME", System.getProperty("JXTA_HOME", "client")); File home = new File(System.getProperty("JXTA_HOME", "client")); if (!JxtaServerPipeExample.configured(home)) { JxtaServerPipeExample.createConfig(home, "JxtaBidiPipeExample", false); } // create, and Start the default jxta NetPeerGroup netPeerGroup = PeerGroupFactory.newNetPeerGroup(); rendezvous = netPeerGroup.getRendezVousService(); login(netPeerGroup, "client", "password"); netPeerGroup.startApp(null); } catch (PeerGroupException e) { // could not instantiate the group, print the stack and exit System.out.println("fatal error : group creation failure"); e.printStackTrace(); System.exit(1); } }
Programming with JXTA JxtaBidiPipeExample public static void main(String args[]) { JxtaBidiPipeExample eg = new JxtaBidiPipeExample(); eg.startJxta(); System.out.println("reading in pipe.adv"); try { FileInputStream is = new FileInputStream("pipe.adv"); eg.pipeAdv = (PipeAdvertisement) AdvertisementFactory.newAdvertisement(MimeMediaType.XMLUTF8, is); is.close(); System.out.println("creating the BiDi pipe"); eg.pipe = new JxtaBiDiPipe(); eg.pipe.setReliable(true); System.out.println("Attempting to establish a connection"); eg.pipe.connect(eg.netPeerGroup, null, eg.pipeAdv, 180000, eg); eg.waitUntilCompleted(); System.exit(0); } catch (Exception e) { System.out.println("failed to bind the JxtaBiDiPipe due to the following exception"); e.printStackTrace(); System.exit(-1); } }
Programming with JXTA JxtaBidiPipeExample public static void login(PeerGroup group, String principal, String password) { try { StringAuthenticator auth = null; MembershipService membership = group.getMembershipService(); Credential cred = membership.getDefaultCredential(); if (cred == null) { AuthenticationCredential authCred = new AuthenticationCredential(group, "StringAuthentication", null); try { auth = (StringAuthenticator) membership.apply(authCred); } catch(Exception failed) {;} if (auth != null) { auth.setAuth1_KeyStorePassword(password.toCharArray()); auth.setAuth2Identity(group.getPeerID()); auth.setAuth3_IdentityPassword(principal.toCharArray()); if (auth.isReadyForJoin()) { membership.join(auth); } } } cred = membership.getDefaultCredential(); if (null == cred) { AuthenticationCredential authCred = new AuthenticationCredential(group, "InteractiveAuthentication", null); InteractiveAuthenticator iAuth = (InteractiveAuthenticator) membership.apply(authCred); if (iAuth.interact() && iAuth.isReadyForJoin()) { membership.join(iAuth); } } } catch(Throwable e) { e.printStackTrace(); System.exit(1); } finally { System.err.flush(); System.out.flush(); } }
Programming with JXTA JxtaBidiPipeExample public void pipeMsgEvent(PipeMsgEvent event) { Message msg = null; try { // grab the message from the event msg = event.getMessage(); if (msg == null) { if (LOG.isEnabledFor(Level.DEBUG)) { LOG.debug("Received an empty message, returning"); } return; } if (LOG.isEnabledFor(Level.DEBUG)) { LOG.debug("Received a response"); } // get the message element named SenderMessage MessageElement msgElement = msg.getMessageElement(SenderMessage, SenderMessage); if (msgElement.toString() == null) { System.out.println("null msg received"); } else { Date date = new Date(System.currentTimeMillis()); System.out.println("Message :"+ msgElement.toString()); count ++; } if (count >= JxtaServerPipeExample.ITERATIONS) { synchronized(completeLock) { completeLock.notify(); } } } catch (Exception e) { if (LOG.isEnabledFor(Level.DEBUG)) { LOG.debug(e); } return; } }
Demo • JxtaBiDiPipe
Programming with JXTA • JxtaSockets • I JxtaSockets si basano sulle pipe unidirezionali e si comportano quasi come i socket java tranne: • non implementano l’algoritmo di Nagel • non utilizzano keep alive messages • Due programmi • JxtaServerSocketExample • Crea il socket • Attende connessione e risponde • JxtaSocketExample • Si connette al socket e invia messaggi Devono avere home directory diverse
Programming with JXTA • The JxtaServerSocket definisce i seguenti metodi: • bind — binds to the pipe within the specified group • accept— waits for JxtaSocket connections within the specified group • setSoTimeout — Sets the ServerSocket Timeout • JxtaSocket defines the following methods: • create()— toggles reliability • getOutputStream ()— returns the output stream for the socket • getInputStream() — returns the intput stream for the socket • setSoTimeout() — Sets the Socket Timeout
Programming with JXTA JxtaServerSocketExample import java.io.File; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.io.FileInputStream; import java.net.Socket; import net.jxta.peergroup.PeerGroup; import net.jxta.peergroup.PeerGroupFactory; import net.jxta.exception.PeerGroupException; import net.jxta.document.AdvertisementFactory; import net.jxta.document.MimeMediaType; import net.jxta.socket.JxtaServerSocket; import net.jxta.protocol.PipeAdvertisement; /** * This tutorial illustrates the use JxtaServerSocket It creates a * JxtaServerSocket with a back log of 10. it also blocks indefinitely, until a * connection is established Once a connection is established, it sends * the content of socket.adv and reads data from the remote side. * */
Programming with JXTA JxtaServerSocketExample public class JxtaServerSocketExample { private transient PeerGroup netPeerGroup = null; private transient PipeAdvertisement pipeAdv; private transient JxtaServerSocket serverSocket; private void sendAndReceiveData(Socket socket) { try { // get the socket output stream OutputStream out = socket.getOutputStream(); // read a file into a buffer File file = new File("socket.adv"); FileInputStream is = new FileInputStream(file); int size = 4096; byte[] buf = new byte[size]; // send some bytes over the socket (the socket adv is used, but int read = is.read(buf, 0, size); // that could be anything. It's just a handshake.) out.write(buf, 0, read); out.flush(); System.out.println(read + " bytes sent"); InputStream in = socket.getInputStream(); // this call should block until bits are avail. long total = 0; long start = System.currentTimeMillis(); while (true) { read = in.read(buf, 0, size); if (read < 1) { break;} total += read; } System.out.println(""); long elapsed = System.currentTimeMillis() - start; System.out.println("EOT. Received " + total + " bytes in " + elapsed + " ms. Throughput = " + ((total * 8000) / (1024 * elapsed)) + " Kbit/s."); socket.close(); System.out.println("Closed connection. Ready for next connection."); } catch (IOException ie) { ie.printStackTrace(); } }
Programming with JXTA JxtaServerSocketExample public void run() { System.out.println("starting ServerSocket"); while (true) { try { System.out.println("Calling accept"); Socket socket = serverSocket.accept(); // set reliable if (socket != null) { System.out.println("socket created"); sendAndReceiveData(socket); } } catch (Exception e) { e.printStackTrace(); } } }
Programming with JXTA JxtaServerSocketExample private void startJxta() { try { System.setProperty("net.jxta.tls.principal", "server"); System.setProperty("net.jxta.tls.password", "password"); System.setProperty("JXTA_HOME", System.getProperty("JXTA_HOME", "server")); File home = new File(System.getProperty("JXTA_HOME","server")); if (!JxtaSocketExample.configured(home)) { JxtaSocketExample.createConfig(home, "JxtaServerSocketExample", true); } // create, and Start the default jxta NetPeerGroup netPeerGroup = PeerGroupFactory.newNetPeerGroup(); //JxtaSocketExample.login(netPeerGroup, "server", "password"); } catch (PeerGroupException e) { // could not instantiate the group, print the stack and exit System.out.println("fatal error : group creation failure"); e.printStackTrace(); System.exit(1); } }
Programming with JXTA JxtaServerSocketExample public static void main(String args[]) { JxtaServerSocketExample socEx = new JxtaServerSocketExample(); socEx.startJxta(); System.out.println("Reading in socket.adv"); try { FileInputStream is = new FileInputStream("socket.adv"); socEx.pipeAdv = (PipeAdvertisement) AdvertisementFactory.newAdvertisement(MimeMediaType.XMLUTF8, is); is.close(); socEx.serverSocket = new JxtaServerSocket(socEx.netPeerGroup, socEx.pipeAdv, 10); // block until a connection is available socEx.serverSocket.setSoTimeout(0); } catch (Exception e) { System.out.println("failed to read/parse pipe advertisement"); e.printStackTrace(); System.exit(-1); } socEx.run(); } }
Programming with JXTA • Example pipe advertisement: socket.adv An example pipe advertisement, saved to the file socket.adv, is listed below: <!DOCTYPE jxta:PipeAdvertisement> <jxta:PipeAdvertisement xmlns:jxta="http://jxta.org"> <Id> urn:jxta:uuid-59616261646162614E5047205032503393B5C2F6CA7A41FBB0F890173088E79404 </Id> <Type> JxtaUnicast </Type> <Name> socket tutorial </Name> </jxta:PipeAdvertisement>
Programming with JXTA JxtaServerSocketExample import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import net.jxta.credential.AuthenticationCredential; import net.jxta.credential.Credential; import net.jxta.document.AdvertisementFactory; import net.jxta.document.MimeMediaType; import net.jxta.document.StructuredDocument; import net.jxta.exception.PeerGroupException; import net.jxta.impl.membership.pse.StringAuthenticator; import net.jxta.impl.protocol.PlatformConfig; import net.jxta.membership.InteractiveAuthenticator; import net.jxta.membership.MembershipService; import net.jxta.peergroup.PeerGroup; import net.jxta.peergroup.PeerGroupFactory; import net.jxta.protocol.PipeAdvertisement; import net.jxta.socket.JxtaSocket; /** * This tutorial illustrates the use JxtaSocket. It attempts to bind a * JxtaSocket to an instance of JxtaServerSocket bound socket.adv. Once a * connection is established, it reads in expected data from the remote * side, and then sends 1824 64K chunks and measures data rate achieved * */
Programming with JXTA JxtaServerSocketExample public class JxtaSocketExample { private transient PeerGroup netPeerGroup = null; private transient PipeAdvertisement pipeAdv; private transient JxtaSocket socket; // number of iterations to send the payload private static int ITERATIONS = 1824; // payload size private static int payloadSize = 64 * 1024; /** * Starts the NetPeerGroup, and logs in *@exception PeerGroupException if a PeerGroupException occurs */ private void startJxta() throws PeerGroupException { System.setProperty("net.jxta.tls.principal", "client"); System.setProperty("net.jxta.tls.password", "password"); System.setProperty("JXTA_HOME", System.getProperty("JXTA_HOME", "client")); File home = new File(System.getProperty("JXTA_HOME", "client")); if (!configured(home)) { createConfig(home, "JxtaSocketExample", false); } // create, and Start the default jxta NetPeerGroup netPeerGroup = PeerGroupFactory.newNetPeerGroup(); }
Programming with JXTA JxtaServerSocketExample public void run() throws IOException { int bufsize = 1024; System.out.println("Connecting to the server"); socket = new JxtaSocket(netPeerGroup, null, pipeAdv, 30000, true); socket.setOutputStreamBufferSize(65536); // Set buffer size to payload size // The server initiates communication by sending a small data packet and then awaits data from the client System.out.println("Reading in data"); InputStream in = socket.getInputStream(); byte[] inbuf = new byte[bufsize]; int read = in.read(inbuf, 0, bufsize); System.out.println("received " + read + " bytes"); // Server is awaiting this data // Send data and time it. System.out.println("Sending back " + payloadSize + " * " + ITERATIONS + " bytes"); OutputStream out = socket.getOutputStream(); byte[] payload = new byte[payloadSize]; long t0 = System.currentTimeMillis(); for (int i = 0; i < ITERATIONS; i++) { out.write(payload, 0, payloadSize); } out.flush(); // include close in timing since it may need to flush the tail end of the stream. socket.close(); long t1 = System.currentTimeMillis(); System.out.println("Completed in :" + (t1 - t0) + " msec"); System.out.println("Data Rate :" + ((long) 64 * ITERATIONS * 8000) / (t1 - t0) + " Kbit/sec"); }
Programming with JXTA JxtaServerSocketExample public static void login(PeerGroup group, String principal, String password) { try { StringAuthenticator auth = null; MembershipService membership = group.getMembershipService(); Credential cred = membership.getDefaultCredential(); if (cred == null) { AuthenticationCredential authCred = new AuthenticationCredential(group, "StringAuthentication", null); try { auth = (StringAuthenticator) membership.apply(authCred);} catch (Exception failed) {;} if (auth != null) { auth.setAuth1_KeyStorePassword(password.toCharArray()); auth.setAuth2Identity(group.getPeerID()); auth.setAuth3_IdentityPassword(principal.toCharArray()); if (auth.isReadyForJoin()) { membership.join(auth); } } } cred = membership.getDefaultCredential(); if (null == cred) { AuthenticationCredential authCred = new AuthenticationCredential(group, "InteractiveAuthentication", null); InteractiveAuthenticator iAuth = (InteractiveAuthenticator) membership.apply(authCred); If (iAuth.interact() && iAuth.isReadyForJoin()) { membership.join(iAuth);} } } catch (Throwable e) { System.out.flush(); // make sure output buffering doesn't wreck console display. System.err.println("Uncaught Throwable caught by 'main':"); e.printStackTrace(); System.exit(1); // make note that we abended } finally { System.err.flush(); System.out.flush(); } }
Programming with JXTA JxtaServerSocketExample /** * returns a resource InputStream *@param resource resource name *@return returns a resource InputStream *@exception IOException if an I/O error occurs */ protected static InputStream getResourceInputStream(String resource) throws IOException { ClassLoader cl = JxtaSocketExample.class.getClassLoader(); return cl.getResourceAsStream(resource); } /** * Returns true if the node has been configured, otherwise false * *@param home node jxta home directory *@return true if home/PlatformConfig exists */ protected static boolean configured(File home) { File platformConfig = new File(home, "PlatformConfig"); return platformConfig.exists(); }
Programming with JXTA JxtaServerSocketExample protected static void createConfig(File home, String name,boolean server) { try { String fname = null; if (server) { fname = "ServerPlatformConfig.master"; } else { fname = "PlatformConfig.master"; } InputStream is = getResourceInputStream(fname); home.mkdirs(); PlatformConfig platformConfig = (PlatformConfig) AdvertisementFactory.newAdvertisement(MimeMediaType.XMLUTF8, is); is.close(); platformConfig.setName(name); File newConfig = new File(home, "PlatformConfig"); OutputStream op = new FileOutputStream(newConfig); StructuredDocument doc = (StructuredDocument) platformConfig.getDocument(MimeMediaType.XMLUTF8); doc.sendToStream(op); op.close(); } catch (IOException e) { e.printStackTrace(); } }
Programming with JXTA JxtaServerSocketExample public static void main(String args[]) { try { JxtaSocketExample socEx = new JxtaSocketExample(); System.out.println("Starting JXTA"); socEx.startJxta(); System.out.println("reading in socket.adv"); FileInputStream is = new FileInputStream("socket.adv"); socEx.pipeAdv = (PipeAdvertisement) AdvertisementFactory.newAdvertisement(MimeMediaType.XMLUTF8, is); is.close(); socEx.run(); // run it once socEx.run(); // run it again, to exclude any object initialization overhead } catch (Throwable e) { System.out.println("failed : " + e); e.printStackTrace(); System.exit(-1); } System.exit(0); }
Demo • JxtaSockets