package net.sourceforge.jsocks.test;
import java.net.*;
import java.io.*;
/**
Plain SOCKS unaware UDP echo server and client.
*/
public class UDPEcho implements Runnable{
private int port;
private InetAddress hostIP;
private DatagramSocket sock;
private static final int BUF_SIZE = 1024;
public UDPEcho(String host,int port)
throws IOException,UnknownHostException{
this.hostIP = InetAddress.getByName(host);
this.port = port;
sock = new DatagramSocket();
System.out.println("UDP: "+sock.getLocalAddress()+":"+
sock.getLocalPort());
//sock.connect(hostIP,port);
}
public void send(String s) throws IOException{
System.out.println("Sending:"+s);
DatagramPacket packet = new DatagramPacket(s.getBytes(),
s.length(),
hostIP,
port);
sock.send(packet);
}
public void run(){
byte[] buf = new byte[BUF_SIZE];
DatagramPacket incomingData = new DatagramPacket(buf,buf.length);
try{
while(true){
sock.receive(incomingData);
System.out.println("UDP From:"+
incomingData.getAddress().getHostAddress()+":"+
incomingData.getPort());
System.out.println(new String(incomingData.getData(),
0,incomingData.getLength()));
System.out.flush();
incomingData.setLength(buf.length);
}
}catch(IOException io_ex){
io_ex.printStackTrace();
}
}
public static void usage(){
System.err.print(
"Usage: java UDPEcho host port\n"+
"OR\n"+
"Usage: java UDPEcho port\n");
}
public static void doEcho(int port)throws IOException{
byte[] buf = new byte[BUF_SIZE];
DatagramPacket packet = new DatagramPacket(buf,buf.length);
DatagramSocket sock = new DatagramSocket(port);
System.out.println("Starting UDP echo on"+
sock.getLocalAddress().getHostAddress()+
":"+sock.getLocalPort());
while(true){
try{
sock.receive(packet);
sock.send(packet);
System.out.print(
"UDP From: "+packet.getAddress().getHostAddress()+":"+
packet.getPort()+
"\n"+
new String(packet.getData(),0,packet.getLength())+
"\n"
);
System.out.flush();
packet.setLength(buf.length);
//packet = new DatagramPacket(buf,buf.length);
}catch(IOException io_ex){
}
}
}
public static void main(String args[]){
int port;
String host;
if(args.length == 1){
try{
port = Integer.parseInt(args[0]);
doEcho(port);
}catch(IOException io_ex){
io_ex.printStackTrace();
System.exit(1);
}catch(NumberFormatException num_ex){
num_ex.printStackTrace();
System.exit(1);
}
}else if(args.length == 2){
try{
host = args[0];
port = Integer.parseInt(args[1]);
UDPEcho ut = new UDPEcho(host,port);
Thread thread = new Thread(ut);
thread.start();
BufferedReader in = new BufferedReader(
new InputStreamReader(System.in));
String s;
System.out.print("Enter datagram:");
s = in.readLine();
while(s != null){
ut.send(s);
try{
Thread.currentThread().sleep(100);
}catch(InterruptedException i_ex){
}
System.out.print("Enter datagram:");
s = in.readLine();
}
System.exit(1);
}catch(IOException io_ex){
io_ex.printStackTrace();
System.exit(1);
}catch(NumberFormatException num_ex){
num_ex.printStackTrace();
System.exit(1);
}
}else{
usage();
}
}
}//End of class