// MD5Asiakas2.java SJ // Ottaa yhteyden MD5Palvelin1:een // demoaa binäärimuotoista tiedonsiirtoa kun viestin pituus annetaan viestin // alussa ja useita tiedostoja voidaan hakea kerralla // tässä tiedosto ladataan kerralla muistiin vaikka sen voisi tehdä paloissakin import java.net.*; import java.util.Scanner; import java.io.*; public class MD5Asiakas2 { public static void main(String[] args) { if (args.length < 3) { System.err.println("Käyttö: java MD5Asiakas2 " + "palvelinosoite portti tiedosto1 [tiedosto2 ..]"); return; } MD5Asiakas2 a = new MD5Asiakas2(); int portti = Integer.valueOf(args[1]); Socket s = a.otayhteys(args[0], Integer.valueOf(args[1])); if (s == null) return; for (int t = 2; t < args.length; t++) { byte[] t1 = a.LueTiedosto(args[t]); if (t1 != null) { byte[] tiiviste = a.haetiiviste2(t1, s); if (tiiviste != null) System.out.println(args[t] + ":" + a.bintohex(tiiviste)); } } } // main() // lähetetään data palvelimelle, vastaanotetaan ja palautetaan tiiviste public Socket otayhteys(String osoite, int portti) { Socket s = null; // yhteydenotto try { s = new Socket(osoite, portti); // yhteydenotto System.out.println("Yhteys onnistui"); return s; } catch (Exception e) { // yhteys ei varmaankaan onnistunut System.err.println(e); return null; } } // otayhteys() // lähetetään data palvelimelle, vastaanotetaan ja palautetaan tiiviste public byte[] haetiiviste2(byte[] data, Socket s) { try { // luodaan keskustelukanavat InputStream in = new BufferedInputStream(s.getInputStream()); OutputStream out = new BufferedOutputStream(s.getOutputStream()); // datan pituus palvelimelle byte[] pituus = TavuApu.intToBytes(data.length); out.write(pituus); out.flush(); // data palvelimelle out.write(data); out.flush(); // vastaanotetaan tiiviste byte[] tiiviste = new byte[128/8]; in.read(tiiviste); return tiiviste; // poikkeusten käsittely } catch (Exception e) { System.err.println(e); if (s != null) try { s.close(); // suljetaan varuilta vielä täälläkin } catch (Exception e2) {} return null; } // catch } // haetiiviste1() // Lukee tiedoston ja palauttaa tavutaulukon static byte[] LueTiedosto(String nimi) { try { RandomAccessFile f = new RandomAccessFile(nimi, "r"); long len = f.length(); byte[] l = new byte[(int)len]; f.read(l); f.close(); return l; } catch (IOException e) { System.out.println(e); return null; } } // palauttaa tavutaulukon heksaesityksen merkkijonona public String bintohex(byte[] A) { int pituus = A.length; StringBuffer sb = new StringBuffer(pituus*2); for (int i = 0; i < pituus; i++) { if ((A[i] & 0xFF) < 0x10) sb.append("0"); sb.append(Integer.toHexString(A[i] & 0xFF)); } return sb.toString(); } }