package org.limewire.rudp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.limewire.concurrent.ManagedThread;
import org.limewire.util.AssertComparisons;
/**
* A standalone program for testing UDPConnections across machines.
*/
public class UStandalone {
private static final Log LOG = LogFactory.getLog(UStandalone.class);
/**
* Writes numbers to <code>usock</code> and expects to read the same
* numbers back.
*/
public static void echoClient(Socket usock, int numBytes)
throws IOException {
OutputStream ostream = usock.getOutputStream();
InputStream istream = usock.getInputStream();
ClientReader reader = new ClientReader(istream, numBytes);
try {
reader.start();
for (int i = 0; i < numBytes; i++) {
ostream.write(i % 256);
if ( (i % 1000) == 0 )
LOG.debug("Write status: "+i);
}
LOG.trace("Done write");
} finally {
try { reader.join(); } catch (InterruptedException ie){}
}
LOG.debug("Done echoClient test");
}
static class ClientReader extends ManagedThread {
InputStream istream;
int numBytes;
public ClientReader(InputStream istream, int numBytes) {
super ("ClientReader");
this.istream = istream;
this.numBytes = numBytes;
}
@Override
public void run() {
int rval;
LOG.debug("Begin read");
int i = 0;
try {
for (; i < numBytes; i++) {
rval = istream.read();
AssertComparisons.assertEquals("Read unexpected value at offset " + i, i % 256, rval);
if ( (i % 1000) == 0 )
LOG.debug("Read status: "+i);
}
} catch (IOException e) {
AssertComparisons.fail("Unexpected exception at offset " + i + ": " + e);
}
LOG.debug("Done read");
}
}
/**
* Echos data read from <code>usock</code> back to <code>usock</code>.
*/
public static void echoServer(Socket usock, int numBytes)
throws IOException {
OutputStream ostream = usock.getOutputStream();
InputStream istream = usock.getInputStream();
int rval;
for (int i = 0; i < numBytes; i++) {
rval = istream.read();
AssertComparisons.assertEquals("Read unexpected value at offset " + i, i % 256, rval);
if ( (i % 1000) == 0 )
LOG.debug("Echo status: "+i);
ostream.write(rval);
}
LOG.trace("Done echo");
}
public static void echoClientBlock(Socket usock, int numBlocks)
throws IOException {
OutputStream ostream = usock.getOutputStream();
InputStream istream = usock.getInputStream();
ClientBlockReader reader = new ClientBlockReader(istream, numBlocks);
reader.start();
try {
// setup transfer data
byte bdata[] = new byte[512];
for (int i = 0; i < 512; i++)
bdata[i] = (byte) (i % 256);
for (int i = 0; i < numBlocks; i++) {
ostream.write(bdata, 0, 512);
if ( (i % 8) == 0 )
LOG.debug("Write status: "+i*512+
" time:"+System.currentTimeMillis());
}
LOG.trace("Done write");
} finally {
try { reader.join(); } catch (InterruptedException ie){}
}
LOG.debug("Done echoClientBlock test");
}
static class ClientBlockReader extends ManagedThread {
InputStream istream;
int numBlocks;
public ClientBlockReader(InputStream istream, int numBlocks) {
this.istream = istream;
this.numBlocks = numBlocks;
}
@Override
public void run() {
LOG.debug("Begin read");
byte bdata[] = new byte[512];
int btest;
int len;
int printTarget = 0;
try {
for (int i = 0; i < 512 * numBlocks; i += len) {
len = istream.read(bdata);
if ( len != 512 )
LOG.debug("Abnormal data size: "+len+" loc: "+i);
for (int j = 0; j < len; j++) {
btest = bdata[j] & 0xff;
if ( btest != ((i+j) % 256) ) {
LOG.debug("Error on read expected: "+(i+j)
+" received: "+bdata[j]);
return;
}
if ( (i+j) > printTarget ) {
LOG.debug("Read status: "+i+
" time:"+System.currentTimeMillis());
printTarget = i+j+1024;
}
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
LOG.debug("Done read");
}
}
public static void echoServerBlock(Socket usock, int numBlocks)
throws IOException {
OutputStream ostream = usock.getOutputStream();
InputStream istream = usock.getInputStream();
byte bdata[] = new byte[512];
int btest;
int len = 0;
for (int i = 0; i < 512 * numBlocks; i += len) {
len = istream.read(bdata);
if ( len != 512 )
LOG.debug("Abnormal data size: "+len+" loc: "+i);
for (int j = 0; j < len; j++) {
btest = bdata[j] & 0xff;
AssertComparisons.assertEquals("Read unexpected value at offset " + j, btest, (i+j) % 256);
if ( ((i+j) % 1024) == 0 )
LOG.debug("Echo status: "+i+
" time:"+System.currentTimeMillis());
}
ostream.write(bdata, 0, len);
}
LOG.trace("Done echoBlock");
//try { Thread.sleep(1*1000); } catch (InterruptedException ie){}
LOG.debug("Done echoServerBlock test");
}
}