// AsiakasEsimerkkiBinaari.java SJ // Ottaa yhteyden PalvelinEsimerkki:in. import java.net.*; import java.util.Scanner; import java.io.PrintWriter; import java.io.DataOutputStream; import java.io.DataInputStream; import java.io.EOFException; import java.io.BufferedOutputStream; import java.io.BufferedInputStream; public class AsiakasEsimerkkiBinaari { static int viestinPituus = 4 + 4; static int vastausViestinPituus = 4 + 8; public static void main(String[] args) { if (args.length < 1) { System.err.println("Käyttö: java AsiakasEsimerkkiBinaari " + "palvelinosoite [portti]"); return; } int portti = 1234; if (args.length > 1) { portti = Integer.valueOf(args[1]); } // "tarkastetaan" protokollan versio // parempi ratkaisu olisi vielä sisällyttää protokollan versio // mukaan if (viestinPituus != PalvelinSaieEsimerkkiBinaari.viestinPituus || vastausViestinPituus != PalvelinSaieEsimerkkiBinaari.vastausViestinPituus) System.err.println("Varoitus: viestien pituuksissa eroa"); AsiakasEsimerkkiBinaari a = new AsiakasEsimerkkiBinaari(); a.keskustele2(args[0], portti); } // main() // toinen asiakas, lukee tiedot käyttäjältä, monta kyselyä/asiakas public void keskustele2(String osoite, int portti) { Socket s = null; Scanner kayttaja = new Scanner(System.in); DataOutputStream out = null; DataInputStream in = null; // yhteydenotto try { s = new Socket(osoite, portti); // yhteydenotto System.out.println("Yhteys onnistui"); // luodaan keskustelukanavat out = new DataOutputStream(new BufferedOutputStream(s.getOutputStream())); in = new DataInputStream(new BufferedInputStream(s.getInputStream())); } catch (Exception e) { // yhteys ei varmaankaan onnistunut System.err.println(e); return; } try { while (kayttaja.hasNext()) { if (! kayttaja.hasNextInt()) break; // muu kuin kokonaisluku lopettaa int x = kayttaja.nextInt(); // lähetä viesti: pituus,data out.writeInt(viestinPituus); out.writeInt(x); out.flush(); // vastaanota viesti int vpituus = in.readInt(); if (vpituus < vastausViestinPituus) { // liian lyhyt viesti tulossa // katkaistaan yhteys System.err.println("liian lyhyt vastausviesti, en osaa käsitellä"); break; } long vastaus = in.readLong(); // skipataan loput viestistä jos tarpeen if (vpituus > vastausViestinPituus) { // ohitetaan loput tavut int skip = in.skipBytes(vpituus - vastausViestinPituus); if (skip != vpituus - vastausViestinPituus) { System.err.println("Pitkän viestin skippaus epäonnistyi"); break; } } System.out.println("Tulos = " + vastaus); } // suljetaan yhteys s.close(); s = null; // 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) {} } // catch } // keskustele2() }