Advertisement
Guest User

Untitled

a guest
Dec 11th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.87 KB | None | 0 0
  1.  
  2. import java.io.*;
  3. import java.net.*;
  4. import java.util.*;
  5.  
  6. class UDPClient {
  7. static DatagramSocket clientSocket;
  8. final static int PORT = 10034;
  9. final static int PACKET_SIZE = 512;
  10. final static int HEADER_SIZE = 118;
  11. final static int WINDOW_SIZE = 8;
  12. final static int ACK = 1;
  13. final static int NAK = 0;
  14.  
  15. static Random generator = new Random(System.currentTimeMillis());
  16. static String ip;
  17. static double damageProb;
  18. static String filename;
  19. static int[] window;
  20. static int startWindow;
  21.  
  22. public static void main(String args[]) throws Exception {
  23. //get user input and send GET request
  24. getUserInput();
  25. clientSocket = new DatagramSocket(PORT);
  26. InetAddress serverIPAddress = InetAddress.getByName(ip);
  27. String request = sendRequestPacket(serverIPAddress, filename);
  28. System.out.println("\n-----TO SERVER-----\n" + request.trim());
  29.  
  30. selectiveRepeat(serverIPAddress);
  31. clientSocket.close();
  32. }
  33.  
  34. private static void selectiveRepeat(InetAddress serverIPAddress) throws Exception {
  35. int totalPacketsReceived = 0;
  36. int packetsDamaged = 0;
  37.  
  38. ArrayList<byte[]> segmentedFile = new ArrayList<byte[]>();
  39. ArrayList<Integer>segmentedFileOrder = new ArrayList<Integer>();
  40. byte[] receiveData = new byte[PACKET_SIZE];
  41. DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
  42. startWindow = 0;
  43. window = new int[WINDOW_SIZE];
  44. Arrays.fill(window, NAK);
  45.  
  46. while(true){
  47. //receive packet
  48. clientSocket.receive(receivePacket);
  49. totalPacketsReceived++;
  50.  
  51. byte[] ori = receivePacket.getData();
  52. byte[] data = new byte[PACKET_SIZE-HEADER_SIZE];
  53. for(int i = 0; i < PACKET_SIZE-HEADER_SIZE; i++) {
  54. data[i] = ori[HEADER_SIZE+i];
  55. }
  56. //check if last packet
  57. if(isNullPacket(receivePacket,data))
  58. break;
  59. //gremlin then check if packet is corrupted
  60. //gremlin(receivePacket);
  61. boolean isDamaged = isErrorDetected(receivePacket, data);
  62. //isDamaged = false; // fuk u - sorry
  63.  
  64. String s = new String(receivePacket.getData());
  65. System.out.println("\n-----FROM SERVER-----\n" + s.trim());
  66.  
  67. //send ACK
  68. if(!isDamaged){
  69. int packetSeqNum = getSeqNum(receivePacket);
  70. String packetString = new String(receivePacket.getData());
  71. //byte[] data = packetString.split("\r\n\r\n")[1].getBytes();
  72. segmentedFileOrder.add(packetSeqNum);
  73. segmentedFile.add(data); // 0 1 2 3 4
  74. ackPacket(packetSeqNum);
  75. String ack = sendAcknowledgement(serverIPAddress);
  76. System.out.println("Enviei um ack " + getSeqNum(receivePacket));
  77. adjustWindow(packetSeqNum);
  78. System.out.println("\n-----TO SERVER-----\n" + ack.trim());
  79. }
  80. else{
  81. System.out.println("***PACKET DAMAGED***");
  82. packetsDamaged++;
  83. System.out.println(packetsDamaged);
  84. }
  85. }
  86. reassembleFile(segmentedFile, segmentedFileOrder);
  87.  
  88. System.out.println("\nTOTAL PACKETS RECEIVED: " + totalPacketsReceived);
  89. System.out.println("PACKETS DAMAGED: " + packetsDamaged + " " + (packetsDamaged/(double)totalPacketsReceived)*100 + "%");
  90. }
  91.  
  92. private static void getUserInput() throws Exception {
  93. BufferedReader inputFromUser = new BufferedReader(new InputStreamReader(System.in));
  94. System.out.print("\nEngineering tux machine to connect to: ");
  95. ip = inputFromUser.readLine();
  96. System.out.print("\nProbabilty that a given packet will be damaged: ");
  97. damageProb = Double.parseDouble(inputFromUser.readLine());
  98. System.out.print("\nEnter file name to request: ");
  99. filename = inputFromUser.readLine();
  100. inputFromUser.close();
  101. }
  102.  
  103. private static String sendRequestPacket(InetAddress serverIPAddress, String filename) throws Exception {
  104. String request = ("GET " + filename + " HTTP/1.0\r\n");
  105. byte[] requestData = new byte[request.length()];
  106. requestData = request.getBytes();
  107. DatagramPacket requestPacket = new DatagramPacket(requestData, requestData.length, serverIPAddress, PORT);
  108. clientSocket.send(requestPacket);
  109. return request;
  110. }
  111.  
  112. private static void ackPacket(int seqNum){
  113. //ACK packet in window
  114. System.out.println(startWindow + " " + seqNum + " " + WINDOW_SIZE);
  115. if(startWindow <= seqNum){
  116. if(seqNum-startWindow < WINDOW_SIZE)
  117. window[seqNum-startWindow] = ACK;
  118. }
  119. }
  120.  
  121. private static void adjustWindow(int seqNum){
  122. //shift window
  123. while(true){
  124. if(window[0] == ACK){
  125. for(int i = 0; i < WINDOW_SIZE-1; i++){
  126. window[i] = window[i+1];
  127. }
  128. window[WINDOW_SIZE-1] = NAK;
  129. startWindow++;
  130. }
  131. else
  132. break;
  133. }
  134. }
  135.  
  136. private static String sendAcknowledgement(InetAddress serverIPAddress) throws Exception {
  137. String ack = ("Seq: " + startWindow + "akaFim Window: ");
  138. for(int i = 0; i < WINDOW_SIZE; i++){
  139. ack += window[i];
  140. }
  141. ack += "\r\n";
  142. byte[] ackData = new byte[ack.length()];
  143. ackData = ack.getBytes();
  144. DatagramPacket ackPacket = new DatagramPacket(ackData, ackData.length, serverIPAddress, PORT);
  145. clientSocket.send(ackPacket);
  146. return ack;
  147. }
  148.  
  149. private static void reassembleFile(ArrayList<byte[]> segmentedFile, ArrayList<Integer> segmentedFileOrder) throws Exception {
  150. FileOutputStream filestream = new FileOutputStream(new File("new_" + filename));
  151. for(int i = 0; i < segmentedFileOrder.size(); i++){ // 0 0 2 3 4 1 5 5 6 7
  152. int index = segmentedFileOrder.indexOf(i);
  153. if(index == -1) {
  154. break;
  155. }
  156. String msg = new String(segmentedFile.get(index)); // testar pra ver se é util
  157. String data0 = msg.replaceAll("\00", "");
  158. String data = data0.replaceAll("\01", "");
  159. byte[] byteData = new byte[data.length()];
  160. byteData = data.getBytes();
  161. //filestream.write(byteData);
  162. filestream.write(segmentedFile.get(index));
  163. }
  164. filestream.close();
  165. }
  166.  
  167. private static void gremlin(DatagramPacket pkt){
  168. int rand = generator.nextInt(10)+1;
  169. if(rand <= damageProb*10){//corrupt packet
  170. int change = generator.nextInt(10)+1; // relevai
  171. if(change <= 5){//change 1 byte
  172. int damage = generator.nextInt(pkt.getLength()-HEADER_SIZE)+HEADER_SIZE;
  173. byte[] buf = pkt.getData();
  174. if(buf[damage] == 0)
  175. buf[damage] += 1;
  176. else
  177. buf[damage] -= 1;
  178. }
  179. else if(change <= 8){//change 2 bytes
  180. for(int i = 0; i < 2; i++){
  181. int damage = generator.nextInt(pkt.getLength()-HEADER_SIZE)+HEADER_SIZE;
  182. byte[] buf = pkt.getData();
  183. if(buf[damage] == 0)
  184. buf[damage] += 1;
  185. else
  186. buf[damage] -= 1;
  187. }
  188. }
  189. else{//change 3 bytes
  190. for(int i = 0; i < 3; i++){
  191. int damage = generator.nextInt(pkt.getLength()-HEADER_SIZE)+HEADER_SIZE;
  192. byte[] buf = pkt.getData();
  193. if(buf[damage] == 0)
  194. buf[damage] += 1;
  195. else
  196. buf[damage] -= 1;
  197. }
  198. }
  199. }
  200. }
  201.  
  202. private static boolean isErrorDetected(DatagramPacket pkt, byte[] data) throws UnsupportedEncodingException{
  203. //get checksum from packet
  204.  
  205. String packetString = new String(pkt.getData(),"UTF-8");
  206. int index = packetString.indexOf("Checksum: ")+("Checksum: ".length());
  207. int index2 = packetString.indexOf("\r\nSeq:");
  208. int checksum = Integer.parseInt(packetString.substring(index, index2));
  209.  
  210. //compute checksum
  211. //byte[] data = packetString.split("\r\n\r\n")[1].getBytes();
  212. //byte[] data =;
  213. byte[] pktData = pkt.getData();
  214. for(int j = 0; j < 512; j++) {
  215.  
  216. }
  217. int computedChecksum = 0;
  218. for(int i = 0; i < data.length; i++){
  219. computedChecksum += (int)data[i];
  220. }
  221.  
  222. //compare checksums
  223. if(computedChecksum == checksum)
  224. return false;
  225. else
  226. return true;
  227. }
  228.  
  229. private static int getSeqNum(DatagramPacket pkt){
  230. String packetString = new String(pkt.getData());
  231. int index = packetString.indexOf("Seq: ")+("Seq: ".length());
  232. int end = packetString.indexOf("akaFim ");
  233. int seq = Integer.parseInt(packetString.substring(index, end).trim());
  234. return seq;
  235. }
  236.  
  237. private static boolean isNullPacket(DatagramPacket pkt,byte[]data){
  238. String pktData = new String(pkt.getData());
  239. byte[] dataByte = pktData.split("\r\n\r\n")[1].getBytes();
  240. for(int j = 0; j < data.length; j++) {
  241. if(data[j] != 0)
  242. return false;
  243. }
  244. return true;
  245. }
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement