Skip to content

Instantly share code, notes, and snippets.

@aurorapar
Created March 26, 2018 05:44
Show Gist options
  • Save aurorapar/536de8b24650d666ddf64c8cf936de80 to your computer and use it in GitHub Desktop.
Save aurorapar/536de8b24650d666ddf64c8cf936de80 to your computer and use it in GitHub Desktop.
TFTP Server
// Client
import java.net.*;
import java.io.*;
import java.util.*;
import java.nio.charset.*;
public class Client
{
public static int serverPort = 69;
public static int blockNumber = 0;
public static String serverAddress = "localhost";
public static void main(String args[])
{
if(args.length != 2)
{
System.out.println("Improper argument length. Correct options are:\n\t[write|read] file");
return;
}
String operation = args[0].toLowerCase();
String fileName = args[1];
if(!"read".equals(operation) && !"write".equals(operation))
{
System.out.println(String.format("Could not handle \'operation\' %s\nAccepted operations are:\n\tread\twrite\n",operation));
return;
}
File f = new File(fileName);
if(!f.exists() || f.isDirectory())
{
System.out.println(String.format("Could not handle request\n\t%s\ndoes not exist", fileName));
return;
}
byte OPCode;
if("read".equals(operation))
OPCode = 0b00000001;
else
{
OPCode = 0b00000010;
}
// Communications
byte[] sendData = new byte[512];
byte[] receiveData = new byte[512];
try
{
DatagramSocket client = new DatagramSocket();
send(OPCode + fileName + 0b00000000 + "netascii" + 0b00000000, client);
DatagramPacket receivedPacket = new DatagramPacket(receiveData, receiveData.length);
client.receive(receivedPacket);
String reply = new String(receivedPacket.getData(), StandardCharsets.US_ASCII).substring(0,receivedPacket.getLength());
System.out.println(reply);
if(0b00000010 == OPCode && "040".equals(reply))
{
System.out.println("\nWrite request acknowledged");
int block = 1;
ByteArrayOutputStream tempData = new ByteArrayOutputStream(512);
FileInputStream fileStream = new FileInputStream(fileName);
while(fileStream.available() > 508)
{
tempData.reset();
tempData.write(0b00000011);
tempData.write((byte) block);
sendData = tempData.toByteArray();
byte[] fileBytes = new byte[508];
fileStream.read(fileBytes);
byte[] combined = new byte[sendData.length + fileBytes.length];
for (int i = 0; i < combined.length; ++i)
{
combined[i] = i < sendData.length ? sendData[i] : fileBytes[i - sendData.length];
}
System.out.println(Arrays.toString(combined));
send(combined,client);
client.setSoTimeout(500);
receivedPacket = new DatagramPacket(receiveData, receiveData.length);
client.receive(receivedPacket);
reply = new String(receivedPacket.getData(), StandardCharsets.US_ASCII).substring(0,receivedPacket.getLength());
if(reply.substring(0,1)=="5")
return;
System.out.println(reply);
block++;
}
client.close();
}
}
catch(Exception e)
{
System.out.println(e.toString());
}
return;
}
public static int getBlocks(String data)
{
int size = data.getBytes().length / 256;
if(data.getBytes().length % 256 > 0 && size > 1)
size++;
return size;
}
public static void send(String response, DatagramSocket client)
{
try
{
byte[] sendData = new byte[512];
sendData = response.getBytes(StandardCharsets.US_ASCII);
InetAddress IP = InetAddress.getByName(Client.serverAddress);
DatagramPacket packetToSend = new DatagramPacket(
sendData,
sendData.length,
IP,
Client.serverPort
);
client.send(packetToSend);
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
public static void send(byte[] response, DatagramSocket client)
{
try
{
byte[] sendData = new byte[512];
InetAddress IP = InetAddress.getByName(Client.serverAddress);
DatagramPacket packetToSend = new DatagramPacket(
response,
sendData.length,
IP,
Client.serverPort
);
client.send(packetToSend);
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
}
// Server
import java.net.*;
import java.io.*;
import java.util.*;
import java.nio.charset.*;
public class Server
{
public static void main(String args[])
{
int serverPort = 69;
try
{
DatagramSocket server = new DatagramSocket(serverPort);
while(true)
{
listen(server);
}
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
public static void listen(DatagramSocket server)
{
byte[] receiveData = new byte[512];
String request;
String response = "";
DatagramPacket receivedPacket = new DatagramPacket(receiveData, receiveData.length);
try
{
server.receive(receivedPacket);
request = new String(receivedPacket.getData(), StandardCharsets.US_ASCII);
request = request.substring(0,receivedPacket.getLength());
System.out.println('"' + request + '"');
if(!Arrays.asList("1","2","3","4").contains(request.substring(0,1)))
{
send("05", server, receivedPacket);
}
if("1".equals(request.substring(0,1)))
{
}
if("2".equals(request.substring(0,1)))
{
System.out.println("\nReceived write request");
String filename = request.replace(request.substring(0,1),"");
filename = filename.replace("0netascii0","");
File f = new File(filename);
byte ACKnumber = 0;
FileOutputStream file = new FileOutputStream (filename);
while(true)
{
send("04"+ ACKnumber,server,receivedPacket);
server.setSoTimeout(500);
server.receive(receivedPacket);
byte[] newData = new byte[receivedPacket.getLength()];
newData = receivedPacket.getData();
System.out.println("Did we get anything?");
file.write(newData);
System.out.println(String.format("\nReceived data: %s bytes", receivedPacket.getLength()));
ACKnumber++;
}
}
}
catch(SocketTimeoutException e)
{
return;
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
public static void send(String response, DatagramSocket server, DatagramPacket receivedPacket)
{
try
{
byte[] sendData = new byte[512];
sendData = response.getBytes(StandardCharsets.US_ASCII);
InetAddress IP = receivedPacket.getAddress();
DatagramPacket packetToSend = new DatagramPacket(
sendData,
sendData.length,
IP,
receivedPacket.getPort()
);
server.send(packetToSend);
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment