// MD5Palvelin2.java // Ottaa vastaan viestejä, viestin alussa viestin pituus // palauttaa MD5-tiivisteen // ei sulje yhteyttä import java.net.*; import java.util.Scanner; import java.security.*; import java.io.*; public class MD5Palvelin2 { // kuunteleva palvelintöpseli ServerSocket ss = null; public static void main(String[] args) { MD5Palvelin2 p; if (args.length > 0) p = new MD5Palvelin2(Integer.valueOf(args[0])); else p = new MD5Palvelin2(); p.kuuntele(); } // main() // konstruktorit avaavat yhteyden kuuntelulle public MD5Palvelin2(int portti) { try { ss = new ServerSocket(portti); System.out.println("Kuunnellaan porttia " + portti); } catch (Exception e) { System.err.println(e); ss = null; } } public MD5Palvelin2() { this(1235); } // kuuntelu "säie" (säikeistetään myöhemmin kurssilla) public void kuuntele() { try { while (true) { // odotetaan uutta yhteyttä Socket cs = ss.accept(); // palvellaan yhteys palvele(cs); } } catch (Exception e) { System.err.println(e); ss = null; } } // kuuntele() // palvelee yhden yhteyden public void palvele(Socket cs) { try { System.out.println("Uusi yhteys: " + cs.getInetAddress() + ":" + cs.getPort()); // virrat käyttökelpoiseen muotoon InputStream in = new BufferedInputStream(cs.getInputStream()); OutputStream out = new BufferedOutputStream(cs.getOutputStream()); // alustetaan tiiviste MessageDigest md = MessageDigest.getInstance("MD5"); // luetaan uusi syöte while (true) { byte[] pituus = new byte[4]; int tavuja = in.read(pituus); if (tavuja == -1) // vastaanotto loppui break; int viestinpituus = TavuApu.bytesToInt(pituus); byte[] puskuri = new byte[viestinpituus]; tavuja = in.read(puskuri); if (tavuja != viestinpituus) System.err.println("Varoitus: väärä tavumäärä"); // lisätään tiivisteeseen md.update(puskuri, 0, tavuja); byte[] tiiviste = md.digest(); out.write(tiiviste); out.flush(); } cs.close(); } catch (Exception e) { System.err.println(e); } } // palvele() } // class