Q:

(Display and add addresses) Develop a client/server application to view and add addresses, as shown in Figure 31.20

0

 (Display and add addresses) Develop a client/server application to view and add addresses, as shown in Figure 31.20.

FIGURE 31.20 You can view and add an address.

Use the StudentAddress class defined in Listing 31.5 to hold the name, street, city, state, and zip in an object.

The user can use the buttons First, Next, Previous, and Last to view an address, and the Add button to add a new address.

Limit the concurrent connections to two clients. Name the client Exercise31_06Client and the server Exercise31_6Server.

All Answers

need an explanation for this answer? contact us directly to get an explanation for this answer

import java.io.*;
import java.net.*;
import java.util.Date;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.geometry.Pos;
import javafx.stage.Stage;

public class Exercise31_06Client extends Application {
	// IO Streams
	ObjectOutputStream objectToServer = null;
	ObjectInputStream objectFromServer = null;
	DataInputStream dataFromServer = null;
	DataOutputStream dataToServer = null;

	// Text fields for address information
	private TextField tfName = new TextField();
	private TextField tfStreet = new TextField();
	private TextField tfCity = new TextField();
	private TextField tfState = new TextField();
	private TextField tfZip = new TextField();

	// Buttons for navigating address information
	private Button btAdd = new Button("Add");
	private Button btFirst = new Button("First");
	private Button btNext = new Button("Next");
	private Button btPrevious = new Button("Previous");
	private Button btLast = new Button("Last");

	// Host name or ip
	String host = "localhost";

	// Address index
	int index = -1;

	// Number of Addresses stored
	int size = 0;

	@Override // Override the start method in the Application class
	public void start(Stage primaryStage) {
		GridPane pane = new GridPane();
		pane.add(new Label("Name"), 0, 0);
		pane.add(tfName, 1, 0);
		pane.add(new Label("Street"), 0, 1);
		pane.add(tfStreet, 1, 1);
		pane.add(new Label("City"), 0, 2);

		// Hbox to store city, state and zip info
		HBox hBox = new HBox(5);
		pane.add(hBox, 1, 2);
		hBox.getChildren().addAll(tfCity, new Label("State"), 
			tfState, new Label("Zip"), tfZip);

		// Hbox to hold buttons
		HBox paneForButtons = new HBox(5);
		paneForButtons.getChildren().addAll(btAdd, btFirst, btNext, btPrevious, btLast);
		pane.add(paneForButtons, 1, 3);
		pane.setHgap(5);
		pane.setVgap(5);

		pane.setAlignment(Pos.CENTER);
		tfName.setPrefColumnCount(15);
		tfState.setPrefColumnCount(15);
		tfCity.setPrefColumnCount(10);
		tfState.setPrefColumnCount(2);
		tfZip.setPrefColumnCount(3);

		// Register handlers
		btAdd.setOnAction(e -> addAddress());
		btFirst.setOnAction(e -> getFirst());
		btNext.setOnAction(e -> getNext());
		btPrevious.setOnAction(e -> getPrevious());
		btLast.setOnAction(e -> getLast());

		// Create a scene and place it in the stage
		Scene scene = new Scene(pane, 375, 130);
		primaryStage.setTitle("Exercise31_06"); // Set the stage title
		primaryStage.setScene(scene); // Place the scene in the stage
		primaryStage.show(); // Display the stage

	}

	/** Add an address */
	private void addAddress() {
		try {
			// Connect to the server
			Socket socket = new Socket(host, 8000);

			// Create an output stream
			dataToServer = new DataOutputStream(socket.getOutputStream());

			// Send a string command to the server
			dataToServer.writeUTF("ADD_STUDENT");
			dataToServer.flush();

			// Get text field
			String name = tfName.getText().trim();
			String street = tfStreet.getText().trim();
			String city = tfCity.getText().trim();
			String state = tfState.getText().trim();
			String zip = tfZip.getText().trim();
	
			// Create a Student object and send to the server
			objectToServer = new ObjectOutputStream(socket.getOutputStream());
			StudentAddress s = 
				new StudentAddress(name, street, city, state, zip);
			objectToServer.writeObject(s);
			
			// Create an input stream
			dataFromServer = new DataInputStream(socket.getInputStream());
			index = dataFromServer.readInt(); // Get this address index
			size = dataFromServer.readInt(); // Get number of addresses stored
			System.out.println("Address index: " + index);
		}
		catch (IOException ex) {
			ex.printStackTrace();
		}
	} 

	/** Display the first address */
	private void getFirst() {
		getAddress(0);
	}

	/** Display the next address */
	private void getNext() {
		getAddress(index + 1);
	}

	/** Display the previous address */
	private void getPrevious() {
		getAddress(index - 1);
	}

	/** Request and Display an object from the server */
	private void getAddress(int i) {
		try {
			// Connect to socket
			Socket socket = new Socket(host, 8000);

			// Send data to server
			dataToServer = new DataOutputStream(socket.getOutputStream());
			dataToServer.writeUTF("GET_INDEX");
			dataToServer.writeInt(i);
			System.out.println("Get index: " + i);
			dataToServer.flush();

			// Recieve object from server
			objectFromServer = new ObjectInputStream(socket.getInputStream());
			StudentAddress s = (StudentAddress)objectFromServer.readObject();
			
			setTextFields(s);

			// Recieve data from server
			dataFromServer = new DataInputStream(socket.getInputStream());
			index = dataFromServer.readInt(); // Get this address index
			size = dataFromServer.readInt(); // Get the number of addresses stored
			System.out.println("Address index: " + index);
		}
		catch (ClassNotFoundException ex) {
			ex.printStackTrace();
		}
		catch(IOException ex) {
			ex.printStackTrace();
		}
	}

	/** Display the Last address */
	private void getLast() {
		try {
			// Connect to socket
			Socket socket = new Socket(host, 8000);

			// Send data to server
			dataToServer = new DataOutputStream(socket.getOutputStream());
			dataToServer.writeUTF("GET_LAST");
			dataToServer.flush();

			// Recieve object from server
			objectFromServer = new ObjectInputStream(socket.getInputStream());
			StudentAddress s = (StudentAddress)objectFromServer.readObject();
			
			setTextFields(s);

			// Recieve data from server
			dataFromServer = new DataInputStream(socket.getInputStream());
			index = dataFromServer.readInt(); // Get this address index
			size = dataFromServer.readInt(); // Get number of addresses stored
			System.out.println("Address index: " + index);
		}
		catch (ClassNotFoundException ex) {
			ex.printStackTrace();
		}
		catch(IOException ex) {
			ex.printStackTrace();
		}
	}

	/** Set the text fields */
	private void setTextFields(StudentAddress s) {
		tfName.setText(s.getName());
		tfStreet.setText(s.getStreet());
		tfCity.setText(s.getCity());
		tfState.setText(s.getState());
		tfZip.setText(s.getZip());
	}
}

StudentAddress.java

public class StudentAddress implements java.io.Serializable {
	private String name;
	private String street;
	private String city;
	private String state;
	private String zip;

	public StudentAddress(String name, String street, String city, 
		String state, String zip) {
		this.name = name;
		this.street = street;
		this.city = city;
		this.state = state;
		this.zip = zip;
	}

	public String getName() {
		return name;
	}

	public String getStreet() {
		return street;
	}

	public String getCity() {
		return city;
	}

	public String getState() {
		return state;
	}

	public String getZip() {
		return zip;
	}
}

Exercise31_06Server.java

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;

public class Exercise31_06Server {
	// IO Streams
	private ObjectInputStream objectFromClient;
	private ObjectOutputStream objectToClient;
	private DataOutputStream dataToClient;
	private DataInputStream dataFromClient;

	// Create a list of student addresses
	private List<StudentAddress> addresses = new ArrayList<>();

	// Limit the concurrent connections to two clients
	private static final int CONCURRENT_CONNECTIONS = 2;

	// Create a semaphore
	private static Semaphore semaphore = new Semaphore(CONCURRENT_CONNECTIONS);

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

	public Exercise31_06Server() {
		try {
			// Create a server socket
			ServerSocket serverSocket = new ServerSocket(8000);
			System.out.println("Server started ");

			while (true) {
				// Listen for a new connection request
				Socket socket = serverSocket.accept();			

				// Create and start a new thread for the connection
				new Thread(new HandleAClient(socket)).start();
			}
		}
		catch (IOException ex) {
			ex.printStackTrace();
		}
		finally {
			try {
				objectFromClient.close();
				objectToClient.close();
				dataFromClient.close();
				dataToClient.close();
			}
			catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}

	// Define the thread class for handling new connection
	class HandleAClient implements Runnable {
		private Socket socket; // A connected socket

		/** Construct a thread */
		public  HandleAClient(Socket socket) {
			this.socket = socket;
		}

		/* Run a thread */
		public void run() {
			try {
				semaphore.acquire(); // Acquire a permit

				// Create an input stream from the socket
				dataFromClient = new DataInputStream(socket.getInputStream());
				String command = dataFromClient.readUTF();

				if (command.equals("ADD_STUDENT")) { // Add object to list
					objectFromClient = new ObjectInputStream(socket.getInputStream());

					// Read object from input and add it to addresses
					StudentAddress object = (StudentAddress)objectFromClient.readObject();
					addresses.add(object);
					System.out.println("Number of students: " + addresses.size());

					// Send object index to client
					dataToClient = new DataOutputStream(socket.getOutputStream());
					dataToClient.writeInt(addresses.indexOf(object));
					dataToClient.writeInt(addresses.size());
				}
				else if (command.equals("GET_INDEX")) { // Send object to client
					// Read data from input
					int index = dataFromClient.readInt();
					System.out.println("Client wants address at index: " + index);
					if (index < 0)
				 		index = 0;
				 	if (index >= addresses.size())
				 		index = addresses.size() - 1;

				 	// Send the specified object and its index to client
					objectToClient = new ObjectOutputStream(socket.getOutputStream());					
					objectToClient.writeObject(addresses.get(index));

					dataToClient = new DataOutputStream(socket.getOutputStream());
					dataToClient.writeInt(index);

					// Send the number of addresses stored
					dataToClient.writeInt(addresses.size()); 
					objectToClient.flush();
					System.out.println("Address at index " + index + " sent to client");
				}
				else if (command.equals("GET_LAST")) { 
					// Send last object to client
					int index = addresses.size() - 1;
					objectToClient = new ObjectOutputStream(socket.getOutputStream());					
					objectToClient.writeObject(addresses.get(index));

					dataToClient = new DataOutputStream(socket.getOutputStream());
					dataToClient.writeInt(index);

					// Send the number of addresses stored
					dataToClient.writeInt(addresses.size());
					objectToClient.flush();
					System.out.println("Address at index " + index + " sent to client");
				}
			}
			catch (ClassNotFoundException ex) {
				ex.printStackTrace();
			}
			catch (IOException ex) {
				ex.printStackTrace();
			}
			catch (InterruptedException ex) {
				ex.printStackTrace();
			}
			finally {
				semaphore.release(); // Release a permit
			}
		}
	}
}

StudentAddress.java

public class StudentAddress implements java.io.Serializable {
	private String name;
	private String street;
	private String city;
	private String state;
	private String zip;

	public StudentAddress(String name, String street, String city, 
		String state, String zip) {
		this.name = name;
		this.street = street;
		this.city = city;
		this.state = state;
		this.zip = zip;
	}

	public String getName() {
		return name;
	}

	public String getStreet() {
		return street;
	}

	public String getCity() {
		return city;
	}

	public String getState() {
		return state;
	}

	public String getZip() {
		return zip;
	}
}

need an explanation for this answer? contact us directly to get an explanation for this answer

total answers (1)

Similar questions


need a help?


find thousands of online teachers now