// PalvelinEsimerkkiAikaKatkaisu.java // Kuuntelee porttia, yhteydestä otta vastaan kokonaislukuja, vastaa neliöimällä // sulkee yhteyden jollei tule kokonaislukua // sulkee myös yhteyden jollei mitään tule viidessä sekunnissa import java.net.*; import java.util.Scanner; import java.io.PrintWriter; import java.io.InputStreamReader; import java.io.BufferedReader; public class PalvelinEsimerkkiAikaKatkaisu { // kuunteleva palvelintöpseli ServerSocket ss = null; public static void main(String[] args) { PalvelinEsimerkkiAikaKatkaisu p; if (args.length > 0) p = new PalvelinEsimerkkiAikaKatkaisu(Integer.valueOf(args[0])); else p = new PalvelinEsimerkkiAikaKatkaisu(); p.kuuntele(); } // main() // konstruktorit avaavat yhteyden kuuntelulle public PalvelinEsimerkkiAikaKatkaisu(int portti) { try { ss = new ServerSocket(portti); System.out.println("Kuunnellaan porttia " + portti); } catch (Exception e) { System.err.println(e); ss = null; } } public PalvelinEsimerkkiAikaKatkaisu() { this(1234); } // kuuntelu "säie" (säikeistetään myöhemmin kurssilla) public void kuuntele() { Socket cs = null; try { // esimerkki aikakatkaisun käytöstä accept():ssä ss.setSoTimeout(10 * 1000); // 10 s while (true) { try { cs = null; // odotetaan uutta yhteyttä cs = ss.accept(); } catch (SocketTimeoutException te) { System.out.println("Onpa hiljaista"); } // palvellaan yhteys if (cs != null) palvele(cs); } } catch (Exception e) { System.err.println(e); ss = null; } } // kuuntele() // palvelee yhden yhteyden public void palvele(Socket cs) { PrintWriter out = null; try { System.out.println("Uusi yhteys: " + cs.getInetAddress() + ":" + cs.getPort()); // rajoitetaan yhteyden aikaa cs.setSoTimeout(5 * 1000); // 10 s BufferedReader in = new BufferedReader( new InputStreamReader(cs.getInputStream())); // virrat käyttökelpoiseen muotoon out = new PrintWriter(cs.getOutputStream(), true); while (true) { // luetaan "pyyntö" String viesti = in.readLine(); if (viesti == null) break; // luku Scannerilla Scanner sc = new Scanner(viesti); if (! sc.hasNextInt()) break; int x = sc.nextInt(); // lähetetään vastaus out.println("" + x + "*" + x + " = " + (x * x)); } cs.close(); // Aikakatkaisupoikkeus } catch (SocketTimeoutException te) { // asiakas hidasteli liikaa try { out.println("Aikakatkaisu, yhteys sulkeutuu"); System.out.println("Aikakatkaisu"); cs.close(); } catch (Exception e) { } } catch (Exception e) { System.err.println(e); } } // palvele() } // class