// UDPPalvelinEsimerkki.java // Ottaa vastaan BigInteger:ejä UDP paketteina // palauttaa kustakin neliön import java.net.*; import java.math.BigInteger; import java.security.*; import java.io.*; public class UDPPalvelinEsimerkki { // kuunteleva palvelintöpseli DatagramSocket ss = null; public static void main(String[] args) { UDPPalvelinEsimerkki p; if (args.length > 0) p = new UDPPalvelinEsimerkki(Integer.valueOf(args[0])); else p = new UDPPalvelinEsimerkki(); p.kuuntele(); } // main() // konstruktorit avaavat yhteyden kuuntelulle public UDPPalvelinEsimerkki(int portti) { try { ss = new DatagramSocket(portti); System.out.println("Kuunnellaan porttia " + portti); } catch (Exception e) { System.err.println(e); ss = null; } } public UDPPalvelinEsimerkki() { this(1235); } // kuuntelu "säie" (säikeistetään myöhemmin kurssilla) public void kuuntele() { byte[] buf = new byte[16*1024]; // 16kt DatagramPacket paketti = new DatagramPacket(buf, buf.length); try { while (true) { // odotetaan uutta pakettia ss.receive(paketti); // palvellaan yhteys palvele(paketti); } } catch (Exception e) { System.err.println(e); ss = null; } } // kuuntele() // palvelee yhden yhteyden public void palvele(DatagramPacket paketti) { try { System.out.println("Uusi paketti: " + paketti.getAddress() + ":" + paketti.getPort()); BigInteger syote, vastaus; if (paketti.getLength() > 0) { // paketin tavutaulukko on pitkä, otetaan viestinä saatu osa // erikseen jotta saadaan BigInteger tehtyä byte[] data = new byte[paketti.getLength()]; System.arraycopy(paketti.getData(), 0, data, 0, paketti.getLength()); // lasketaan vastaus syote = new BigInteger(data); vastaus = syote.pow(2); } else vastaus = new BigInteger("-1"); // rakennetaan ja lähetetään paluupaketti byte[] paluuData = vastaus.toByteArray(); DatagramPacket vastausPaketti = new DatagramPacket(paluuData, 0, paluuData.length, paketti.getAddress(), paketti.getPort()); ss.send(vastausPaketti); } catch (Exception e) { System.err.println(e); } } // palvele() } // class