A java program to with allows one to experiment with various protocols.
54df769e7add98507c2c2dbf5d45b9b46f3fde0beb12d1dceb1dadf817642cfa
/************************************
* *
* Flexible Client Program *
* *
* BY: Simeon Bassett *
* *
* simeon_b@hotmail.com *
* *
* This comment must remain. *
* *******************************************
* *
* More information about the program and the *
* source code can be found within the readme.txt file (if there is one) *
* *
* You may freely ditribute this as you wish, however you may not alter it *
* in any way without my permission. *
* *
* If you do alter it please leave my comments in. *
* You MUST leave in this comment. *
* *
*******************************************************************************/
import java.io.*;
import sun.net.*;
class rawclient extends Thread
{
//Globals
static NetworkClient net; //used to create the client object and then input and print streams from that
static BufferedReader net_input;
static PrintStream net_output;
static BufferedReader input;
static String range = "port must be a whole number in the range of 0 - 65536";
//Here is the string for the help command
static String help = "More information is in the readme.txt file \n\n to send information to the server, simply type in the string and hit enter, to get information, hit enter on a blank line \n\nCommands: \n help - Displays this message \n quit - quits the program \n restart - restarts the program without quitting \n repeat - repeats a certain message \n delay repeat - not implemented yet \n port scan - checks for open ports on a computer \n port fondle - repeatedly connects to a server \n view repeat - view the message send in repeat \n send - send a message to the server, used for sending a piece of information that is already a command such as quit or help \n";
static boolean noCommand = true;
static String header = "Raw Client By: Simeon Bassett simeon_b@hotmail.com \n";
static boolean firstCycle = true;
static String server;
static int port;
static String repeatBuffer = ""; //for the repeat command
static int delay = 200;
public static void main(String arg[])
{
if (firstCycle) //do these only when the program starts
{
System.out.println(header);
input = new BufferedReader(new InputStreamReader(System.in));
firstCycle = false;
}
try
{
System.out.print("server:");
server = input.readLine();
if(server.equals(""))
{
server = "cjnetworks.com";
System.out.println(server);
}
System.out.print("port:");
String tempPort = input.readLine();
if(tempPort.equals(""))
{
port = 25;
}
else
{
port = (new Integer(tempPort)).intValue();
}
System.out.println("port has been read (" + port + ")" ); //debugging info
if( (check_server(server) && check_port(port)) )
{
System.out.println("Creating client object");
net = new NetworkClient(server, port);
System.out.println("Client object Created");
}
else
{
System.out.println("There was an error in the client specification");
main(null);
return;
}
}
catch(IOException e)
{
System.out.println("connection not possible");
}
catch(NumberFormatException e)
{
System.out.println(range);
}
catch(NullPointerException e)
{
System.out.println("There was an error in the client specification");
}
if(!net.serverIsOpen())
{
System.out.println("server is not open");
main(null);
return;
}
net_input = new BufferedReader(new InputStreamReader(net.serverInput));
net_output = net.serverOutput;
program(input, net_input, net_output);
return;
}
/**************************************
* Program Core *
**************************************/
/* I didn't name the variables in the program()
function the same as the globals because
of scope problems that I didn't want to work around
with the scope resolution operator. I guess that will teach me to use
global variables. */
static void program(BufferedReader program_input, BufferedReader program_net_input, PrintStream program_net_output)
{
String command = "";
System.out.print("%");
try { command = program_input.readLine(); } catch(IOException e) { System.out.println(e); return; }
/********************
* Features *
********************/
if (command.equalsIgnoreCase("help"))
{
System.out.println(help);
noCommand = false;
}
if (command.equalsIgnoreCase("quit"))
{
cleanUp();
noCommand = false;
return;
}
if (command.equalsIgnoreCase("restart"))
{
main(null);
return;
}
if (command.equalsIgnoreCase("repeat"))
{
int countMax = 0;
int count = 0;
String sync = "0";
repeatBuffer = "";
System.out.print("message: ");
while(!(repeatBuffer.endsWith("*\n")))
{
try { repeatBuffer += program_input.readLine() + "\n"; } catch(IOException e) { }
}
repeatBuffer = repeatBuffer.substring( 0 , repeatBuffer.length() - 2 ); //shave the ending command off
System.out.print("Times to repeat: ");
try
{
countMax = (new Integer(program_input.readLine())).intValue();
}
catch(IOException e)
{
System.out.println("IO error " + e);
}
System.out.print("Sync to input from server: ");
try { sync = program_input.readLine(); } catch(IOException e) { }
if(sync.equals(""))
{
while(count < countMax)
{
program_net_output.println(repeatBuffer);
count++;
}
}
else
{
String netInput = "";
boolean breakLoop = false;
System.out.println(repeatBuffer);
while(count < countMax)
{
program_net_output.println(repeatBuffer);
while(true) //wait until sync message is encountered before moving on
{
try
{
if(net_input.ready())
netInput = net_input.readLine();
System.out.println(netInput);
if ( netInput.lastIndexOf(sync) != -1 )
{
breakLoop = true;
}
sleep(delay);
}
catch(IOException e)
{
}
catch(InterruptedException e)
{
}
if(breakLoop)
break;
}
count++;
try { sleep(delay); } catch(InterruptedException e) { }
}
}
command = "";
}
if (command.equalsIgnoreCase("delay repeat"))
{
}
if (command.equalsIgnoreCase("port scan"))
{
//Create the variables
String portScanServer = "";
int portsFound = 0;
int startAt = 0;
int endAt = 65536;
int threads = 1;
int timeout = 1000;
int split;
int portPoint;
int extraPorts = 0;
int totalScanningPorts;
//Reset portScan's static variables
portScan.totalPortsFound = 0;
portScan.finishedThreads = 0;
portScan.portsChecked = 0;
//Get user Input
try
{
//lots of user input for this one
System.out.print("Server: ");
portScanServer = program_input.readLine();
System.out.print("Start at: ");
startAt = (new Integer(program_input.readLine())).intValue();
System.out.print("End at: ");
endAt = (new Integer(program_input.readLine())).intValue();
System.out.print("Threads: ");
threads = (new Integer(program_input.readLine())).intValue();
/* System.out.print("timeout: ");
timeout = (new Integer(program_input.readLine())).intValue(); */
System.out.print("Open ports found at: ");
}
catch(IOException e)
{
}
//Variable Arithmetic to set up for port scan
totalScanningPorts = endAt - startAt;
//if there are more thread than ports just go with one thread to each port
if (totalScanningPorts < threads)
threads = totalScanningPorts;
extraPorts = totalScanningPorts % threads;
split = (totalScanningPorts - extraPorts)/threads;
portPoint = startAt + split + extraPorts;
portScan[] scanner = new portScan[threads];
scanner[0] = new portScan(portScanServer , startAt , portPoint , timeout );
scanner[0].start();
portPoint++;
int count = 1;
while (count < threads)
{
scanner[count] = new portScan(portScanServer , portPoint , portPoint + split , timeout);
scanner[count].start();
portPoint += split + 1;
count++;
}
while(portScan.finishedThreads < threads) //check to make sure that all of the threads have finished and wait until they do
{
try
{
sleep(1000);
}
catch(InterruptedException e)
{
}
}
System.out.print("\n");
System.out.println(portScan.portsChecked + " ports were checked");
if(portScan.totalPortsFound == 0)
System.out.print("there were no open ports found, how dissappointing!");
else
System.out.print("there were " + portScan.totalPortsFound + " open ports found ");
System.out.print("\n");
noCommand = false;
}
if (command.equalsIgnoreCase("port fondle"))
{
String server;
int port;
int cycles;
int countInner = 0;
int countOuter = 0;
int connectDelay = 0;
try
{
//the input
System.out.print("Server: ");
server = program_input.readLine();
System.out.print("port: ");
port = (new Integer(program_input.readLine())).intValue();
System.out.print("cycles: ");
cycles = (new Integer(program_input.readLine())).intValue();
System.out.print("delay: ");
connectDelay = (new Integer(program_input.readLine())).intValue();
//The meat
while(countOuter < cycles)
{
while ( countInner < 65536 )
{
try
{
new java.net.Socket(server , port);
sleep(connectDelay);
countInner++;
}
catch(IOException e)
{
}
catch(InterruptedException e)
{
}
}
countOuter++;
System.out.print(".");
}
System.out.println("All cycles complete");
}
catch(IOException e)
{
System.out.print(e);
}
noCommand = false;
}
if (command.equalsIgnoreCase("view repeat"))
{
System.out.println(repeatBuffer);
noCommand = false;
}
if (command.equalsIgnoreCase("send"))
{
System.out.print("-->");
try { command = program_input.readLine(); } catch(IOException e) { }
}
if (noCommand)
{
if(!(command.equals("")))
program_net_output.println(command);
else
printNet();
}
/******************
* End Features *
******************/
program(program_input, program_net_input, program_net_output);
return;
}
/**************************************
* Functions *
**************************************/
static void cleanUp()
{
printNet();
//Clean up time
try
{
//close the global client object
net.closeServer();
//close the global IO streams
net_input.close();
net_output.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
static void printNet()
{
String netInput = "";
try
{
while(net_input.ready())
{
netInput = net_input.readLine();
System.out.println(netInput);
}
}
catch(IOException e)
{
System.out.println("could not get input from server");
}
return;
}
static boolean check_server(String server)
{
if(server.equals(""))
{
System.out.println("server not valid");
return false;
}
return true;
}
static boolean check_port(int port)
{
if(port > 65536)
{
System.out.println(range + " (more than 65536)");
return false;
}
if(port < 0)
{
System.out.println(range + " (less than 0)");
return false;
}
return true;
}
}
/******************************
* Classes *
******************************/
class portScan extends Thread
{
java.net.Socket server;
String serverName;
int startingPort;
int endingPort;
int count;
int timeOut;
static final int portMin = 0;
static final int portMax = 65536;
public static int totalPortsFound = 0;
public static int finishedThreads = 0;
public static int portsChecked = 0;
public portScan(String serverAddress, int startPort, int endPort , int timeout)
{
serverName = serverAddress;
count = startingPort = startPort;
endingPort = endPort;
timeOut = timeout;
}
public void run()
{
while(count <= endingPort)
{
try
{
server = new java.net.Socket(serverName , count);
System.out.print(" " + count + " ");
portScan.totalPortsFound++;
}
catch(IOException e)
{
System.out.print(".");
portsChecked++;
}
count++;
}
finishedThreads++;
return;
}
}