/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package net.jxta.socket.examples;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.security.SecureRandom;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.jxta.platform.NetworkConfigurator;
import net.jxta.platform.NetworkManager;
import net.jxta.platform.NetworkManager.ConfigMode;
import net.jxta.socket.JxtaServerSocket;
import net.jxta.socket.JxtaSocket;
/**
*
* @author nick
*/
public class SocketTestReliable {
private static File tempStorage;
protected NetworkManager rdvManager;
protected NetworkManager aliceManager;
protected NetworkManager bobManager;
private String referenceDataFileName = "referenceDataFileName";
private String streamedDataFileName = "streamedDataFileName";
public static void main(String[] args) {
try {
SocketTestReliable t = new SocketTestReliable();
t.init();
t.run();
t.end();
} catch (Exception ex) {
ex.printStackTrace();
}
}
protected void init() {
System.setProperty("net.jxta.logging.Logging", "OFF");
System.setProperty("net.jxta.level", "OFF");
try {
rmdir(tempStorage);
tempStorage = new File("tempStorage");
tempStorage.mkdir();
initPeers();
} catch (Exception ex) {
ex.printStackTrace();
}
}
protected void end() {
try {
killPeers();
SystemTestUtils.rmdir(tempStorage);
} catch (Exception ex) {
ex.printStackTrace();
}
}
protected void run() {
try {
SecureRandom secureRandom = new SecureRandom();
// private String referenceDataFileName = "referenceDataFileName";
// private String streamedDataFileName = "streamedDataFileName";
byte[] buf = new byte[3000];
File referenceDataFile = new File(referenceDataFileName);
FileOutputStream fos = new FileOutputStream(referenceDataFile);
System.err.println("current time : " + new Date());
for (int i=0;i<1000;i++) {
secureRandom.nextBytes(buf);
fos.write(buf);
fos.flush();
}
fos.close();
System.err.println("referenceDataFileName generated at : " + new Date());
JxtaServerSocketRunnable serverSocketRunnable = new JxtaServerSocketRunnable(true);
Thread thread = new Thread(serverSocketRunnable);
thread.start();
//JxtaSocket clientSocket = new JxtaSocket(PeerGroup group, PeerID peerid, PipeAdvertisement pipeAdv, int timeout, boolean reliable);
JxtaSocket clientSocket=null;
try {
clientSocket = new JxtaSocket(bobManager.getNetPeerGroup(), aliceManager.getPeerID(), serverSocketRunnable.getJxtaServerSocket().getPipeAdv(), 5000, true);
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("got first client socket at : " + new Date() + ", clientSocket = " + clientSocket);
FileInputStream referenceDataFileInputStream = new FileInputStream(referenceDataFileName);
OutputStream os = clientSocket.getOutputStream();
int len;
while((len=referenceDataFileInputStream.read(buf))>=0) {
os.write(buf, 0, len);
os.flush();
}
os.close();
clientSocket.close();
referenceDataFileInputStream.close();
// if (!clientSocket.isClosed())
// clientSocket.close();
System.err.println("client socket finished sending file at : " + new Date());
//buf
} catch (Exception ex) {
ex.printStackTrace();
}
}
class JxtaServerSocketRunnable implements Runnable {
private boolean encrypt;
private JxtaServerSocket serverSocket;
JxtaServerSocketRunnable(boolean encrypt) throws IOException {
this.encrypt = encrypt;
serverSocket = SystemTestUtils.createServerSocket(aliceManager, encrypt);
System.err.println("JxtaServerSocketRunnable run 1");
}
public void run() {
while(!serverSocket.isClosed()) {
try {
System.err.println("JxtaServerSocketRunnable run 1");
JxtaSocket jxtaSocket = (JxtaSocket) serverSocket.accept();
System.err.println("JxtaServerSocketRunnable run 2");
processSocket(jxtaSocket);
} catch (IOException ex) {
Logger.getLogger(SocketTestReliable.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
JxtaServerSocket getJxtaServerSocket() {
return serverSocket;
}
void close() throws IOException {
serverSocket.close();
}
private void processSocket(JxtaSocket jxtaSocket) throws IOException {
System.err.println("got server socket at : " + new Date());
byte[] streamedbuf = new byte[3000];
File streamedDataFile = new File(streamedDataFileName);
FileOutputStream fos = new FileOutputStream(streamedDataFile);
InputStream is = jxtaSocket.getInputStream();
int streamedlen;
while((streamedlen=is.read(streamedbuf))>=0) {
fos.write(streamedbuf, 0, streamedlen);
}
fos.close();
is.close();
// jxtaSocket.close();
System.err.println("server socket fisished reading data at : " + new Date());
boolean dataCorrect = true;
FileInputStream referenceDataFileInputStream = new FileInputStream(referenceDataFileName);
FileInputStream streamedDataFileInputStream = new FileInputStream(streamedDataFileName);
byte[] referencebuf = new byte[3000];
while((streamedlen=streamedDataFileInputStream.read(streamedbuf))>=0) {
int referencelen = referenceDataFileInputStream.read(referencebuf);
if (referencelen != streamedlen) {
dataCorrect = false;
System.err.println("server socket referencelen != streamedlen, referencelen = " + referencelen + ", streamedlen = " + streamedlen);
}
}
if (referenceDataFileInputStream.read() != -1) {
System.err.println("referenceDataFileInputStream.read() != -1");
dataCorrect = false;
}
if (streamedDataFileInputStream.read() != -1) {
System.err.println("streamedDataFileInputStream.read() != -1");
dataCorrect = false;
}
referenceDataFileInputStream.close();
streamedDataFileInputStream.close();
System.err.println("server socket fisished comparing data at : " + new Date() + ", dataCorrect = " + dataCorrect);
}
}
public static void rmdir(File dir) throws IOException {
if (null == dir)
return;
if (!dir.exists())
return;
File[] children = dir.listFiles();
if (children!=null)
for (int i=0; i<children.length; i++) {
if(children[i].isFile())
children[i].delete();
else if (children[i].isDirectory())
rmdir(children[i]);
}
dir.delete();
}
public void initPeers() throws Exception {
rdvManager = new NetworkManager(ConfigMode.RENDEZVOUS, "rdv", (new File(tempStorage, "rdv")).toURI());
configureForTcp(rdvManager, 57080, true);
aliceManager = new NetworkManager(ConfigMode.ADHOC, "alice", (new File(tempStorage, "alice")).toURI());
configureForTcp(aliceManager, 59080, false);
bobManager = new NetworkManager(ConfigMode.ADHOC, "bob", (new File(tempStorage, "bob")).toURI());
configureForTcp(bobManager, 58081, false);
Object object = new Object();
synchronized(object) {
rdvManager.startNetwork();
object.wait(2000);
aliceManager.startNetwork();
object.wait(2000);
bobManager.startNetwork();
object.wait(2000);
}
System.out.println("peerid rdvManager " + rdvManager.getNetPeerGroup().getPeerID());
System.out.println("peerid aliceManager " + aliceManager.getNetPeerGroup().getPeerID());
System.out.println("peerid bobManager " + bobManager.getNetPeerGroup().getPeerID());
System.out.println("rdv is reachable from alice " + ((net.jxta.impl.endpoint.EndpointServiceImpl)aliceManager.getNetPeerGroup().getEndpointService()).isReachable(rdvManager.getPeerID(), true));
System.out.println("rdv is reachable from bob " + ((net.jxta.impl.endpoint.EndpointServiceImpl)bobManager.getNetPeerGroup().getEndpointService()).isReachable(rdvManager.getPeerID(), true));
System.out.println("bob is reachable from alice " + ((net.jxta.impl.endpoint.EndpointServiceImpl)aliceManager.getNetPeerGroup().getEndpointService()).isReachable(bobManager.getPeerID(), true));
System.out.println("alice is reachable from bob " + ((net.jxta.impl.endpoint.EndpointServiceImpl)bobManager.getNetPeerGroup().getEndpointService()).isReachable(aliceManager.getPeerID(), true));
}
private void configureForTcp(NetworkManager manager, int port, boolean isRdv) throws IOException {
NetworkConfigurator configurator = manager.getConfigurator();
configurator.setTcpEnabled(true);
configurator.setHttpEnabled(false);
configurator.setHttp2Enabled(false);
configurator.setTcpIncoming(true);
configurator.setTcpOutgoing(true);
configurator.setTcpPort(port);
configurator.setTcpStartPort(port);
configurator.setTcpEndPort(port+100);
configurator.setUseMulticast(true);
if (!isRdv) {
java.util.HashSet rendezvoussHashSet = new java.util.HashSet();
String rendezvous = "tcp://10.0.0.12:"+57080;
rendezvoussHashSet.add(rendezvous);
configurator.setRendezvousSeeds(rendezvoussHashSet);
}
}
public void killPeers() throws Exception {
aliceManager.stopNetwork();
bobManager.stopNetwork();
}
}