// MD5Asiakas1.java SJ // Ottaa yhteyden MD5Palvelin1:een // demoaa binäärimuotoista tiedonsiirtoa kun viestin loppumerkkinä // käytetään TCP yhteyden sulkemista // tässä tiedosto ladataan kerralla muistiin vaikka sen voisi tehdä paloissakin import java.net.*; import java.util.Scanner; import java.io.*; public class MD5Asiakas1 { public static void main(String[] args) { if (args.length < 2) { System.err.println("Käyttö: java MD5Asiakas1 " + "tiedosto palvelinosoite [portti]"); return; } MD5Asiakas1 a = new MD5Asiakas1(); int portti = 1235; if (args.length > 2) { portti = Integer.valueOf(args[2]); } byte[] t1 = LueTiedosto(args[0]); byte[] tiiviste = a.haetiiviste1(t1, args[1], portti); if (tiiviste != null) System.out.println(a.bintohex(tiiviste)); } // main() // lähetetään data palvelimelle, vastaanotetaan ja palautetaan tiiviste public byte[] haetiiviste1(byte[] data, String osoite, int portti) { Socket s = null; // yhteydenotto try { s = new Socket(osoite, portti); // yhteydenotto System.out.println("Yhteys onnistui"); } catch (Exception e) { // yhteys ei varmaankaan onnistunut System.err.println(e); return null; } try { // luodaan keskustelukanavat InputStream in = new BufferedInputStream(s.getInputStream()); OutputStream out = new BufferedOutputStream(s.getOutputStream()); // data palvelimelle out.write(data); out.flush(); // suljetaan töpselin lähetyssuunta, // vastapää tietää tiedoston loppuneen s.shutdownOutput(); // vastaanotetaan tiiviste byte[] tiiviste = new byte[128/8]; in.read(tiiviste); // suljetaan yhteys s.close(); 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(); } }