-
Notifications
You must be signed in to change notification settings - Fork 106
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #70 from HarryDulaney/new-solutions
bug fix ex 31 02
- Loading branch information
Showing
7 changed files
with
242 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package ch_31.exercise31_02; | ||
|
||
/** | ||
* Data Transfer Object for BMI data | ||
* <p> | ||
* This class is used to transfer data from the client to the server. | ||
* For Exercise31_02, the client sends the weight and height for a person to the server. | ||
*/ | ||
public class BmiDto { | ||
private double weight; | ||
private double height; | ||
|
||
public BmiDto() { | ||
} | ||
|
||
public BmiDto(double weight, double height) { | ||
this.weight = weight; | ||
this.height = height; | ||
} | ||
|
||
public double getWeight() { | ||
return weight; | ||
} | ||
|
||
public double getHeight() { | ||
return height; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package ch_31.exercise31_02; | ||
|
||
import javafx.application.Application; | ||
import javafx.application.Platform; | ||
import javafx.stage.Stage; | ||
|
||
/** | ||
* *31.2 (BMI server) Write a server for a client. The client sends the weight and | ||
* height for a person to the server (see Figure 31.18a). The server computes | ||
* BMI (Body Mass Index) and sends back to the client a string that reports the | ||
* BMI (see Figure 31.18b). See Section 3.8 for computing BMI. Name the client | ||
* Exercise31_02Client and the server Exercise31_02Server. | ||
*/ | ||
public class Exercise31_02 extends Application { | ||
@Override | ||
public void start(Stage primaryStage) throws Exception { | ||
System.out.println("##-_-_--_--_--__-_-- Starting: Exercise31_02 --_-__--__--__--_--_--##"); | ||
Platform.runLater(() -> new Exercise31_02Server().start(new Stage())); | ||
Platform.runLater(() -> new Exercise31_02Client().start(new Stage())); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
package ch_31.exercise31_02; | ||
|
||
import javafx.application.Application; | ||
import javafx.event.ActionEvent; | ||
import javafx.event.EventHandler; | ||
import javafx.geometry.HPos; | ||
import javafx.geometry.Pos; | ||
import javafx.geometry.VPos; | ||
import javafx.scene.Scene; | ||
import javafx.scene.control.Button; | ||
import javafx.scene.control.Label; | ||
import javafx.scene.control.TextArea; | ||
import javafx.scene.control.TextField; | ||
import javafx.scene.layout.GridPane; | ||
import javafx.stage.Stage; | ||
|
||
import java.io.*; | ||
import java.net.Socket; | ||
|
||
public class Exercise31_02Client extends Application { | ||
private TextField weightTextInput = new TextField(); | ||
private TextField heightTextInput = new TextField(); | ||
private TextArea displayResultTextArea = new TextArea(); | ||
|
||
private Button submitButton = new Button("Submit"); | ||
|
||
// Host name or ip | ||
String host = "localhost"; | ||
|
||
private ObjectOutputStream toServer; | ||
private DataInputStream fromServer; | ||
|
||
public Exercise31_02Client() { | ||
System.out.println("##-_-_--_--_--__-_-- Starting: Exercise31_02Client --_-__--__--__--_--_--##"); | ||
} | ||
|
||
@Override | ||
public void start(Stage primaryStage) { | ||
Stage stage = new Stage(); | ||
GridPane pane = new GridPane(); | ||
pane.add(new Label("Weight in pounds"), 0, 0); | ||
pane.add(weightTextInput, 1, 0); | ||
pane.add(new Label("Height in inches"), 0, 1); | ||
pane.add(heightTextInput, 1, 1); | ||
pane.add(submitButton, 1, 3); | ||
pane.add(displayResultTextArea, 1, 4); | ||
GridPane.setHalignment(submitButton, HPos.RIGHT); | ||
GridPane.setValignment(displayResultTextArea, VPos.BOTTOM); | ||
pane.setAlignment(Pos.CENTER); | ||
weightTextInput.setPrefColumnCount(15); | ||
heightTextInput.setPrefColumnCount(15); | ||
submitButton.setOnAction(new ButtonListener()); | ||
|
||
Scene scene = new Scene(pane, 450, 200); | ||
stage.setTitle("BMI Client"); | ||
stage.setScene(scene); | ||
stage.show(); | ||
|
||
try (Socket socket = new Socket(host, 8000)) { | ||
// Create an output stream to the server | ||
toServer = new ObjectOutputStream(socket.getOutputStream()); | ||
// Create an input stream from the server | ||
fromServer = new DataInputStream(socket.getInputStream()); | ||
} catch (IOException ex) { | ||
System.out.println("##----------- Client Error: IOException: " + ex.getMessage() + " -----------##"); | ||
} | ||
} | ||
|
||
/** | ||
* Custom event handler for the submit button | ||
*/ | ||
private class ButtonListener implements EventHandler<ActionEvent> { | ||
@Override | ||
public void handle(ActionEvent e) { | ||
try { | ||
// Get weight and height from the text fields | ||
double weight = Double.parseDouble(weightTextInput.getText().trim()); | ||
double height = Double.parseDouble(heightTextInput.getText().trim()); | ||
// Create a BmiDto and send to the server | ||
BmiDto s = new BmiDto(weight, height); | ||
toServer.writeObject(s); | ||
toServer.flush(); | ||
// Get resulting BMI from the server | ||
double bmi = fromServer.readDouble(); | ||
// Display to the text area | ||
displayResultTextArea.setText("Weight: " + weight + "\nHeight: " + height + "\nBMI is: " + bmi | ||
+ "\n" + getCategory(bmi)); | ||
} catch (IOException ex) { | ||
System.out.println("##----------- Client Error: IOException: " + ex.getMessage() + " -----------##"); | ||
} | ||
} | ||
} | ||
|
||
private String getCategory(double bmi) { | ||
if (bmi < 18.5) { | ||
return "Underweight"; | ||
} else if (bmi < 25) { | ||
return "Normal"; | ||
} else if (bmi < 30) { | ||
return "Overweight"; | ||
} else { | ||
return "Obese"; | ||
} | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
package ch_31.exercise31_02; | ||
|
||
import javafx.application.Application; | ||
import javafx.application.Platform; | ||
import javafx.scene.Scene; | ||
import javafx.scene.control.ScrollPane; | ||
import javafx.scene.control.TextArea; | ||
import javafx.stage.Stage; | ||
|
||
import java.io.*; | ||
import java.net.ServerSocket; | ||
import java.net.Socket; | ||
import java.util.Date; | ||
import java.util.Objects; | ||
import java.util.concurrent.atomic.AtomicBoolean; | ||
|
||
public class Exercise31_02Server extends Application { | ||
private static final double KILOGRAMS_PER_POUND = 0.45359237; | ||
private static final double METERS_PER_INCH = 0.0254; | ||
|
||
private AtomicBoolean isRunning = new AtomicBoolean(true); | ||
|
||
public Exercise31_02Server() { | ||
System.out.println("##-_-_--_--_--__-_-- Starting: Exercise31_02Server --_-__--__--__--_--_--##"); | ||
} | ||
|
||
|
||
@Override | ||
public void start(Stage primaryStage) { | ||
TextArea displayLogTextArea = new TextArea(); | ||
Scene scene = new Scene(new ScrollPane(displayLogTextArea), 450, 200); | ||
primaryStage.setTitle("TicTacToeServer"); | ||
primaryStage.setScene(scene); | ||
primaryStage.show(); | ||
new Thread(() -> runServer(displayLogTextArea)).start(); | ||
} | ||
|
||
private void runServer(TextArea displayLogTextArea) { | ||
/* Create a server socket. Use try with resources to close the socket automatically */ | ||
try (ServerSocket serverSocket = new ServerSocket(8000)) { | ||
// Listen for a connection request | ||
Socket socket = socket = serverSocket.accept(); | ||
// Create data input and output streams | ||
try (ObjectInputStream inputFromClient = new ObjectInputStream( | ||
socket.getInputStream())) { | ||
try (DataOutputStream outputToClient = new DataOutputStream( | ||
socket.getOutputStream())) { | ||
|
||
Platform.runLater(() -> displayLogTextArea.appendText(new Date() + | ||
": Server started at socket 8000\n")); | ||
while (true) { | ||
if (!isRunning.get()) { | ||
break; | ||
} | ||
if (inputFromClient.available() > 0) { | ||
// Receive Object from the client | ||
Object object = inputFromClient.readObject(); | ||
if (Objects.nonNull(object) && object instanceof BmiDto) { | ||
BmiDto bmiDto = (BmiDto) object; | ||
double weight = bmiDto.getWeight(); | ||
double height = bmiDto.getHeight(); | ||
double bmi = calculateBmi(weight, height); | ||
// Send area back to the client | ||
outputToClient.writeDouble(bmi); | ||
} | ||
} | ||
|
||
} | ||
} | ||
} | ||
|
||
} catch (ClassNotFoundException | IOException ex) { | ||
System.out.println("##----------- Server Error: Exception: " + ex.getMessage() + " -----------##"); | ||
} | ||
} | ||
|
||
private double calculateBmi(double weight, double height) { | ||
double weightInKilograms = weight * KILOGRAMS_PER_POUND; | ||
double heightInMeters = height * METERS_PER_INCH; | ||
return weightInKilograms / | ||
(heightInMeters * heightInMeters); | ||
} | ||
|
||
} |