* Упражнение 11, 2015
Публикувано на 05 декември 2015 в раздел ПИК3 Java.
В това упражнение доработваме програмата от миналото упражнение като я правим клиент-сървър приложение. Ще направим клиент, който ще се свързва със сървъра и ще му изпраща пациент (Patient). Сървърът ще излекува пациента по съответния ред и ще върне обратно на клиента Report. Сървърът ще е направен така, че да може да обслужва много клиенти, но не едновременно, а един по един.
По сървъра редакциите са основно върху main метода на класа на създаденото преди това приложение. Това, което трябва да направите, е:
- Сериализирайте класове Report, Diagnosis и Patient. Diagnosis трябва да се сериализира понеже се използва като член-променлива в клас Patient;
- Променете основния клас по следния начин:
package upr11; import java.util.ArrayList; import java.util.HashSet; import java.net.Socket; import java.net.ServerSocket; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class Upr11{ private static ArrayList<Debtor> debtors = new ArrayList<Debtor>(); static void addDebtor(Debtor d){ debtors.add(d); } static void printDebtors(){ for(Debtor d: debtors){ System.out.println(d.patient.name + " owes " + d.debt); } } public static void main(String[] args) { MedicalRoom mr = new MedicalRoom(1, "Ivan Ivanov"); HospitalRoom hr = new HospitalRoom(2, "Petar Petrov"); GPOffice gp = new GPOffice(mr, hr); System.out.println("Starting server"); ServerSocket ss = null; try{ ss = new ServerSocket(5000); } catch(IOException e){ System.out.println("Can't start server"); return; } System.out.println("Server started"); while(true){ Socket s = null; ObjectInputStream sin = null; ObjectOutputStream sout = null; try{ System.out.println("Waiting for client"); s = ss.accept(); sin = new ObjectInputStream(s.getInputStream()); System.out.println("Client connected"); Object o = sin.readObject(); if(!(o instanceof Patient)){ System.out.println("Client sent invalid class"); s.close(); continue; } Patient p = (Patient)o; System.out.println(p.name+" entered"); sout = new ObjectOutputStream(s.getOutputStream()); sout.flush(); if(!gp.nextPatient(p)){ Report r = new Report(p); r.message = "We cannot cure "+p.name; sout.writeObject(r); sout.flush(); s.close(); continue; } // First pass HospitalRoom while(hr.hasMorePatients()){ Report r = hr.nextPatient(); if(r.debt>0) addDebtor(new Debtor(r.patient, r.debt)); gp.logReport(r.patient, r); if(r.patient.isSick() && r.patient.paycheck>0) mr.queuePatient(r.patient); } // First pass MedicalRoom while(mr.hasMorePatients()){ Report r = mr.nextPatient(); if(r.debt>0) addDebtor(new Debtor(r.patient, r.debt)); gp.logReport(r.patient, r); } sout.writeObject(gp.reports.get(p)); sout.flush(); s.close(); } catch(IOException e){ System.out.println("Connection failure: "+e.getMessage()); continue; } catch(ClassNotFoundException e2){ System.out.println("Client sent invalid data: "+e2.getMessage()); continue; } } } }
За клиента направете:
- Пакетирайте Report, Diagnosis и Patient в jar файл и го добавете в проект за клиента;
- Създайте основен клас с main метод със следния код:
package upr11Client; import upr11.Diagnosis; import upr11.Patient; import upr11.Report; import java.util.Set; import java.util.HashSet; import java.util.HashMap; import java.util.List; import java.util.Iterator; import java.net.Socket; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Scanner; import java.util.ArrayList; public class Upr11Clent{ public static void main(String[] args){ Scanner s = new Scanner(System.in); System.out.print("Enter your name: "); String name = s.nextLine(); System.out.print("Enter your egn: "); String egn = s.nextLine(); System.out.println("Enter your paycheck: "); double paycheck = Double.valueOf(s.nextLine()); HashSet<Diagnosis> sicknesses = new HashSet<Diagnosis>(); String command = ""; do{ System.out.print("Enter sickness name: "); command = s.nextLine(); if(!command.equals("end")) sicknesses.add(new Diagnosis(0.0, command)); } while(!command.equals("end")); Patient p = new Patient(name, egn, paycheck, sicknesses); Report r = null; try{ System.out.println("Connecting to server"); Socket sock = new Socket("localhost", 5000); System.out.println("Connected"); ObjectOutputStream sout = new ObjectOutputStream(sock.getOutputStream()); sout.flush(); System.out.println("Sending data"); sout.writeObject(p); sout.flush(); System.out.println("Reading responce"); ObjectInputStream sin = new ObjectInputStream(sock.getInputStream()); r = (Report)sin.readObject(); sock.close(); } catch(IOException e){ System.out.println("IO error"); } catch(ClassNotFoundException e2){ System.out.println("Server sent invalid data: "+e2.getMessage()); } if(r!=null){ r.print(); p=r.patient; } System.out.println("\n"+p.name+" your paycheck at the end is "+p.paycheck); } }
Добави коментар