Created
March 26, 2018 05:44
-
-
Save aurorapar/536de8b24650d666ddf64c8cf936de80 to your computer and use it in GitHub Desktop.
TFTP Server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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()); | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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