Sunday, 5 March 2017

Chapter 31 Exercise 5, Introduction to Java Programming, Tenth Edition Y. Daniel LiangY.

31.5 (Send loan information in an object) Revise Exercise 31.1 for the client to
send a loan object that contains annual interest rate, number of years, and loan
amount and for the server to send the monthly payment and total payment.

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Loan implements Serializable{
 
 private static final long serialVersionUID = 1L;
 
 private double annualInterestRate;
   private int numberOfYears;
   private double loanAmount;
   private java.util.Date loanDate;

   /** Default constructor */
   public Loan() {
     this(2.5, 1, 1000);
   }

   /** Construct a loan with specified annual interest rate,
       number of years, and loan amount
     */
   public Loan(double annualInterestRate, int numberOfYears,
       double loanAmount) {
     this.annualInterestRate = annualInterestRate;
     this.numberOfYears = numberOfYears;
     this.loanAmount = loanAmount;
     loanDate = new java.util.Date();
   }

   /** Return annualInterestRate */
   public double getAnnualInterestRate() {
     return annualInterestRate;
   }

   /** Set a new annualInterestRate */
   public void setAnnualInterestRate(double annualInterestRate) {
     this.annualInterestRate = annualInterestRate;
   }

   /** Return numberOfYears */
   public int getNumberOfYears() {
     return numberOfYears;
   }

   /** Set a new numberOfYears */
   public void setNumberOfYears(int numberOfYears) {
     this.numberOfYears = numberOfYears;
   }

   /** Return loanAmount */
   public double getLoanAmount() {
     return loanAmount;
   }

   /** Set a newloanAmount */
   public void setLoanAmount(double loanAmount) {
     this.loanAmount = loanAmount;
   }

   /** Find monthly payment */
   public double getMonthlyPayment() {
     double monthlyInterestRate = annualInterestRate / 1200;
     double monthlyPayment = loanAmount * monthlyInterestRate / (1 -
       (1 / Math.pow(1 + monthlyInterestRate, numberOfYears * 12)));
     return monthlyPayment;    
   }

   /** Find total payment */
   public double getTotalPayment() {
     double totalPayment = getMonthlyPayment() * numberOfYears * 12;
     return totalPayment;    
   }

   /** Return loan date */
   public java.util.Date getLoanDate() {
     return loanDate;
   }
}

import java.awt.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import javax.swing.*;

public class Exercise05s extends JFrame {
 private static final long serialVersionUID = 1L;
 private int ClientNumber = 1;

 private JTextArea jta = new JTextArea();

 public static void main(String[] args) {
  new Exercise05s();
 }

 public Exercise05s() {
  setLayout(new BorderLayout());
  add(new JScrollPane(jta), BorderLayout.CENTER);
  setTitle("Exercise03");
  setSize(500, 300);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setLocationRelativeTo(null);
  setVisible(true);

  ServerSocket serverSocket = null;
  try {
   serverSocket = new ServerSocket(8000);
   jta.append("Exercise01s started at " + new Date() + '\n');

   while (true) {
    
    Socket socket = serverSocket.accept();
    jta.append("Startig thread for client " + ClientNumber + " at + " + new Date() + "\n");
    InetAddress inetAddress = socket.getInetAddress();
    jta.append("Client " + ClientNumber + "'s host name is " + inetAddress.getHostName() + "\n");
    jta.append("Client " + ClientNumber + "'s Ip address is " + inetAddress.getHostAddress() + "\n");
    
    HandleAClient task = new HandleAClient(socket);
    new Thread(task).start();
    ClientNumber++;
   }
  } catch (IOException ex) {
   System.err.println(ex);
  }
  
 }
 
 class HandleAClient implements Runnable {
  
  private Socket socket;
  private ObjectInputStream input;
  private ObjectOutputStream output;
  public HandleAClient(Socket socket) {
   this.socket = socket;   
  }
  
  @Override
  public void run() {
   try {
     input = new ObjectInputStream(socket.getInputStream());
     output = new ObjectOutputStream(socket.getOutputStream());
     while(true) {
      Object object = input.readObject();
      Loan loan = (Loan)object;
      double annualInterestRate = loan.getAnnualInterestRate();
      int numOfYears = loan.getNumberOfYears();
      double loanAmount = loan.getLoanAmount();
      double totalPayment = loanAmount*annualInterestRate/100*numOfYears + loanAmount;
      double monthlyPayment = totalPayment/numOfYears/12;
      output.writeObject(loan);
      output.flush();
      jta.append("Annual Interest Rate " + annualInterestRate + "\n");
      jta.append("Number Of Years " + numOfYears + "\n");
      jta.append("Loan Amount " + loanAmount + "\n");
      jta.append("monthlyPayment " + monthlyPayment + "\n");
      jta.append("totalPayment " + totalPayment + "\n");
     }     
   } catch (IOException e) {
    e.printStackTrace();
   }catch (ClassNotFoundException ex) {
            ex.printStackTrace();
   }

  }
  
 }
}

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Exercise05c extends JFrame {
 private static final long serialVersionUID = 1L;
 private JTextField jtfAnnualInterestRate = new JTextField();
 private JTextField jtfNumberOfYears = new JTextField();
 private JTextField jtfLoanAmount = new JTextField();
 private JTextArea jta = new JTextArea();
 private ObjectInputStream response;
 private ObjectOutputStream request;

 public static void main(String[] args) {
  new Exercise05c();
 }

 public Exercise05c() {
  JPanel jPanel1 = new JPanel(new GridLayout(3, 2, 5, 5));
  jPanel1.add(new JLabel("Annual Interest Rate"));
  jPanel1.add(jtfAnnualInterestRate);
  jPanel1.add(new JLabel("Number Of Years"));
  jPanel1.add(jtfNumberOfYears);
  jPanel1.add(new JLabel("Loan Amount"));
  jPanel1.add(jtfLoanAmount);
  JPanel jPanel2 = new JPanel(new BorderLayout(5, 5));
  jPanel2.add(jPanel1, BorderLayout.CENTER);
  JButton jButton1 = new JButton("Submit");
  jPanel2.add(jButton1, BorderLayout.EAST);
  
  setLayout(new BorderLayout());
  add(jPanel2, BorderLayout.NORTH);
  add(new JScrollPane(jta), BorderLayout.CENTER);

  jButton1.addActionListener(new Listener());

  setTitle("Exercise05c");
  setSize(500, 300);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setLocationRelativeTo(null);
  setVisible(true);

  Socket socket;
  try {
   socket = new Socket("localhost", 8000);
   request = new ObjectOutputStream(socket.getOutputStream());
            response = new ObjectInputStream(socket.getInputStream());
   
  } catch (IOException ex) {
   jta.append(ex.toString() + '\n');
  }
 }

 private class Listener implements ActionListener {
  @Override
  public void actionPerformed(ActionEvent e) {
   try {
    Double rate = Double.parseDouble(jtfAnnualInterestRate.getText());
    int numOfYears = Integer.parseInt(jtfNumberOfYears.getText());
    Double loanAmount = Double.parseDouble(jtfLoanAmount.getText());
    
    request.writeObject(new Loan(rate, numOfYears, loanAmount));
    request.flush();
    Loan loan = (Loan)response.readObject();
    double monthlyPayment = loan.getMonthlyPayment();
    double totalPayment = loan.getTotalPayment();
    
    jta.append("Annual Interest Rate " + rate + "\n");
    jta.append("Number Of Years " + numOfYears + "\n");
    jta.append("Loan Amount " + loanAmount + "\n");
    jta.append("monthlyPayment " + monthlyPayment + "\n");
    jta.append("totalPayment " + totalPayment + "\n");
   } catch (IOException ex) {
    System.err.println(ex);
   }
   catch (ClassNotFoundException ex) {
    ex.printStackTrace();
   }
   finally {
   try {
    response.close();
    request.close();
   }
   catch (IOException ex) {
    ex.printStackTrace();
   }
  }
 }
}

}

No comments :

Post a Comment