* Упражнение 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);
}
}
Добави коментар