Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Sep 7th, 2012  |  syntax: None  |  size: 10.83 KB  |  hits: 21  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. package robot;
  2.  
  3. import java.io.*;
  4. import java.net.*;
  5. import java.util.*;
  6.  
  7. /**
  8.  *
  9.  * @author Tomas Zeidler
  10.  * @author zeidltom@fel.cvut.cz
  11.  */
  12. class Robot {
  13.  
  14.     public static void main(String[] args) throws SocketException, UnknownHostException, FileNotFoundException, IOException {
  15.         if (args.length == 0) {
  16.             System.err.println("Client: java robot.Robot <hostname> <port>");
  17.             System.err.println("Server: java robot.Robot <port>");
  18.             System.exit(1);
  19.         } else if (args.length > 1) {
  20.         } else {
  21.             System.out.println("Spousteni DOWNLOADU...\n");
  22.             Download download = new Download(args[0], 4000);
  23.             //Download download = new Download("baryk.fit.cvut.cz", 4000);
  24.             download.startDownload();
  25.         }
  26.     }
  27. }
  28.  
  29. class Download { //trida starajici se o pripojeni a stazeni fotky
  30.  
  31.     public InetAddress address;
  32.     public DatagramSocket dsocket;
  33.     private byte[] databyte;
  34.     private int id;
  35.     private int lengthInPacket;
  36.  
  37.     Download(String string, int i) throws SocketException, UnknownHostException {
  38.         address = InetAddress.getByName(string);
  39.         dsocket = new DatagramSocket(i);
  40.         dsocket.connect(address, 4000);
  41.         dsocket.setSoTimeout(100);
  42.         databyte = new byte[250000];
  43.         /*for (int j = 0; j < 250000; j++) {
  44.         databyte[j] = 0;
  45.         }*/
  46.     }
  47.  
  48.     void startDownload() throws SocketException, FileNotFoundException, IOException { //hlavni metoda starajici se o komunikaci
  49.         byte[] uvodniData = new byte[1];
  50.         uvodniData[0] = 1;
  51.         Packet uvodniPacket = new Packet(0, 0, 0, 1, uvodniData); //vytvoreni a odeslani SYN packetu
  52.         odeslatPacket(uvodniPacket);
  53.         id = -1;
  54.         Packet p;
  55.         while (true) { //cekani na prijem SYN packetu
  56.             try {
  57.                 p = prijmoutPacket();
  58.                 if (p.flags == 1) {
  59.                     this.id = p.id;
  60.                     break;
  61.                 }
  62.             } catch (SocketTimeoutException ex) {
  63.                 System.err.println(ex.getMessage());
  64.                 odeslatPacket(uvodniPacket);
  65.             }
  66.         }
  67.         System.out.println("Moje ID: " + Integer.toHexString(this.id));
  68.         Packet rec;
  69.         int main = 0;
  70.         int temp = 0;
  71.         int last = 0;
  72.         int preteceni = 0;
  73.         dsocket.setSoTimeout(2000);
  74.         while (true) { //zpracovani prijateho packetu
  75.             try {
  76.                 rec = prijmoutPacket();
  77.                 if (rec.id == this.id) { //kontrola ID
  78.                     System.out.println(lengthInPacket);
  79.                     if (rec.flags == 0) { //kontrola flags pro normalni komunikaci
  80.                         for (int i = 0; i < 260; i++) { //kontrola preteceni
  81.                             if (i * 255 + 254 == rec.seq) {
  82.                                 preteceni = 1;
  83.                                 System.out.println("preteceni1");
  84.                                 break;
  85.                             }
  86.                             if (i * 255 + 253 == rec.seq) {
  87.                                 preteceni = 2;
  88.                                 System.out.println("preteceni2");
  89.                                 break;
  90.                             }
  91.                             if (i * 255 + 252 == rec.seq) {
  92.                                 preteceni = 3;
  93.                                 System.out.println("preteceni3");
  94.                                 break;
  95.                             }
  96.                             if (i * 255 + 255 == rec.seq) {
  97.                                 preteceni = 0;
  98.                                 System.out.println("preteceni0");
  99.                                 break;
  100.                             }
  101.                         }
  102.                         if (rec.seq == main * 255) { //ulozeni dat z packetu do pole bytu
  103.                             System.arraycopy(rec.data, 0, databyte, rec.seq, rec.data.length);
  104.                             main++;
  105.                         } else {
  106.                             System.arraycopy(rec.data, 0, databyte, rec.seq + preteceni * 65536, rec.data.length);
  107.                         }
  108.                         if (lengthInPacket < 255) { //kontrola posledniho packetu
  109.                             last = lengthInPacket + rec.seq;
  110.                             if (((main + temp) * 255) % 65536 >= rec.seq) {
  111.                                 Packet konecnyPacket = new Packet(this.id, 0, last, 0, new byte[0]);
  112.                                 odeslatPacket(konecnyPacket);
  113.                                 continue;
  114.                             }
  115.                         }
  116.                         temp = 0;
  117.                         if (databyte[main * 255] == 0 && databyte[main * 255 + 1] == 0) { //kontrola pro odeslani ack
  118.                             System.out.println("-----------------------------------------------------------------------1");
  119.                             Packet potvrzovaciPacket = new Packet(this.id, 0, main * 255 % 65536, 0, new byte[0]);
  120.                             odeslatPacket(potvrzovaciPacket);
  121.                         } else {
  122.                             while (databyte[(main + temp) * 255] != 0 || databyte[(main + temp) * 255 + 10] != 0 || databyte[(main + temp) * 255 + 20] != 0 || databyte[(main + temp) * 255 + 30] != 0) {
  123.                                 temp++;
  124.                             }
  125.                             System.out.println(databyte[(main + temp) * 255] + " " + databyte[(main + temp) * 255 + 10] + " " + databyte[(main + temp) * 255 + 20] + " " + databyte[(main + temp) * 255 + 30]);
  126.                             System.out.println("-------------------------------------------------------------------2---" + (main + temp));
  127.                             Packet potvrzovaciPacket = new Packet(this.id, 0, ((main + temp) * 255) % 65536, 0, new byte[0]);
  128.                             odeslatPacket(potvrzovaciPacket);
  129.                         }
  130.                     } else if (rec.flags == 1) { //kontrola flags pro SYN
  131.                         System.err.println("===== CHYBA prijem SYN =====");
  132.                     } else if (rec.flags == 2) { //kontrola flags pro FIN
  133.                         System.out.println("========== Prijat FIN, odesilam FIN ==========");
  134.                         byte[] finData = new byte[0];
  135.                         Packet finPacket = new Packet(this.id, 0, rec.seq, 2, finData);
  136.                         odeslatPacket(finPacket);
  137.                         break;
  138.                     } else if (rec.flags == 4) { //kontrola flags pro RST
  139.                         System.out.println("===== VAROVANI prijem RST =====");
  140.                     } else { //pokud prijde uplne jine flags
  141.                         System.out.println("===== CHYBA prijem ??? =====");
  142.                     }
  143.                 } else { //pokud prijde spatne ID
  144.                     System.out.println("VAROVANI spatne ID");
  145.                 }
  146.             } catch (Exception ex) {
  147.                 System.err.println(ex);
  148.                 break;
  149.             }
  150.         }
  151.         writeFile(databyte, "foto_" + new Date().getTime() + ".png", last);
  152.         System.out.println("Done");
  153.         close();
  154.     }
  155.  
  156.     public void writeFile(byte[] bytes, String fileName, int last) throws FileNotFoundException, IOException { //zapis pole bytu do souboru
  157.         byte[] out = new byte[196608 + last];
  158.         System.arraycopy(bytes, 0, out, 0, 196608 + last);
  159.         FileInputStream fileInputStream = null;
  160.         File file = new File(fileName);
  161.         if (file.exists()) {
  162.             file.delete();
  163.         }
  164.         file.createNewFile();
  165.         fileInputStream = new FileInputStream(file);
  166.         fileInputStream.read(out);
  167.         fileInputStream.close();
  168.         FileOutputStream fileOuputStream = new FileOutputStream(fileName);
  169.         fileOuputStream.write(out);
  170.         fileOuputStream.close();
  171.     }
  172.  
  173.     public void odeslatPacket(Packet packet) { //odesila packet
  174.         try {
  175.             DatagramPacket dp = new DatagramPacket(packet.getPacket(), packet.getSize());
  176.             dsocket.send(dp);
  177.             int lengthOutPacket = packet.getSize() - 9;
  178.             System.out.println("Odeslan: id=" + Integer.toHexString(packet.id) + " ack=" + packet.ack + " flags=" + packet.flags + " o velikosti " + lengthOutPacket);
  179.         } catch (IOException ex) {
  180.             System.err.println("CHYBA odeslatPacket " + ex);
  181.         }
  182.     }
  183.  
  184.     public Packet prijmoutPacket() throws SocketTimeoutException { //prijima packet
  185.         byte[] prijataData = new byte[264];
  186.         DatagramPacket dp = new DatagramPacket(prijataData, 264);
  187.         try {
  188.             dsocket.receive(dp);
  189.         } catch (SocketTimeoutException ex) {
  190.             throw new SocketTimeoutException("CHYBA prijmoutPacket " + ex.getMessage());
  191.         } catch (Exception e) {
  192.             System.err.println("CHYBA 2 prijmoutPacket " + e.getMessage());
  193.         }
  194.         Packet packet = new Packet(prijataData);
  195.         lengthInPacket = dp.getLength() - 9;
  196.         System.out.println("Prijat: id=" + Integer.toHexString(packet.id) + " seq=" + packet.seq + " flags=" + packet.flags + " o velikosti " + lengthInPacket);
  197.         return packet;
  198.     }
  199.  
  200.     public void close() { //uzavre DatagramSocket
  201.         dsocket.close();
  202.     }
  203. }
  204.  
  205. class Packet { //trida pro praci s packetem
  206.  
  207.     public int id;
  208.     public int seq;
  209.     public int ack;
  210.     public int flags;
  211.     public byte[] data;
  212.  
  213.     public Packet(int id, int seq, int ack, int flags, byte[] data) { //kostruktor - pro vytvoreni packetu z dat
  214.         this.id = id;
  215.         this.seq = seq;
  216.         this.ack = ack;
  217.         this.flags = flags;
  218.         if (data == null) {
  219.             this.data = new byte[0];
  220.         } else {
  221.             this.data = data;
  222.         }
  223.     }
  224.  
  225.     public Packet(byte[] pole) { // konstruktor - zjisti z pole bytu id, seq, ack, flags a data
  226.         this.data = new byte[pole.length - 9];
  227.         this.id = (byteToInt(pole[0]) << 24) + (byteToInt(pole[1]) << 16) + (byteToInt(pole[2]) << 8) + byteToInt(pole[3]);
  228.         this.seq = (byteToInt(pole[4]) << 8) + byteToInt(pole[5]);
  229.         this.ack = (byteToInt(pole[6]) << 8) + byteToInt(pole[7]);
  230.         this.flags = byteToInt(pole[8]);
  231.         for (int i = 0; i < pole.length - 9; i++) {
  232.             this.data[i] = pole[i + 9];
  233.         }
  234.     }
  235.  
  236.     public int getSize() { //vrati velikost packetu
  237.         return 9 + data.length;
  238.     }
  239.  
  240.     public byte[] getPacket() { //vztvori a vrati packet
  241.         byte[] out = new byte[264];
  242.         out[0] = (byte) ((id >> 24) % 256);
  243.         out[1] = (byte) ((id >> 16) % 256);
  244.         out[2] = (byte) ((id >> 8) % 256);
  245.         out[3] = (byte) ((id) % 256);
  246.         out[4] = (byte) ((seq >> 8) % 256);
  247.         out[5] = (byte) ((seq) % 256);
  248.         out[6] = (byte) ((ack >> 8) % 256);
  249.         out[7] = (byte) ((ack) % 256);
  250.         out[8] = (byte) ((flags));
  251.         System.arraycopy(data, 0, out, 9, data.length);
  252.         return out;
  253.     }
  254.  
  255.     private int byteToInt(byte b) { //prevede bytovou hodnotu do int
  256.         return (int) ((b < 0) ? (b + 256) : b);
  257.     }
  258. }