// SalaOlioPalvelinEsimerkki.java // SealedObject välitystä ObjectIn/OutputStream:llä import java.net.*; import java.io.*; import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; public class SalaOlioPalvelinEsimerkki { static String avainTiedosto = "avain"; static SecretKeySpec avain = null; // kuunteleva palvelintöpseli ServerSocket ss = null; public static void main(String[] args) { SalaOlioPalvelinEsimerkki p; if (args.length > 0) p = new SalaOlioPalvelinEsimerkki(Integer.valueOf(args[0])); else p = new SalaOlioPalvelinEsimerkki(); p.kuuntele(); } // main() // konstruktorit avaavat yhteyden kuuntelulle public SalaOlioPalvelinEsimerkki(int portti) { try { avain = SalausApu.lueAvain(avainTiedosto); System.out.println("Avain = |" + SalausApu.bintohex(avain.getEncoded()) + "|"); ss = new ServerSocket(portti); System.out.println("Kuunnellaan porttia " + portti); } catch (Exception e) { System.err.println(e); ss = null; } } public SalaOlioPalvelinEsimerkki() { this(1234); } // 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()); // Luetaan olio ObjectInputStream oIn = new ObjectInputStream(cs.getInputStream()); SealedObject so = (SealedObject) oIn.readObject(); SalattavaOlio olio = (SalattavaOlio) SalausApu.puraOlio(so, avain); // rakennetaan vastaus SalattavaOlio vastaus = new SalattavaOlio(olio.toString() + olio.toString()); SealedObject soV = SalausApu.salaaOlio(vastaus, avain); // kirjoitetaan olio takaisin ObjectOutputStream oOut = new ObjectOutputStream(cs.getOutputStream()); oOut.writeObject(soV); cs.close(); } catch (Exception e) { System.err.println("palvele" + e); } } // palvele() } // class