C, PHP, VB, .NET

Дневникът на Филип Петров


* Упражнение 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);
  }
}

 



Добави коментар

Адресът на електронната поща няма да се публикува


*