Pages

Friday, 3 March 2017

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

31.4 (Count clients) Write a server that tracks the number of the clients connected to the server. When a new connection is established, the count is incremented by 1. The count is stored using a random-access file. Write a client program that receives the count from the server and display a message, such as You are visitor number 11, as shown in Figure 31.19. Name the client Exercise31_04Client and the server Exercise31_04Server.

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class Exercise04s extends JFrame{
 private static final long serialVersionUID = 1L;
 private int ClientNumber = 0;
 private JTextArea jta = new JTextArea();
 private JButton jButton = new JButton("Stop");
 private int count;
 private RandomAccessFile raf;
 
 public static void main(String[] args) {
  new Exercise04s();
 }
 
 public Exercise04s() {
  jButton.addActionListener(new ActionListener() {   
   @Override
   public void actionPerformed(ActionEvent e) {    
    try {     
     raf.seek(0);
     raf.writeInt(count);
     System.exit(0);
    } catch (IOException e2) {
     e2.printStackTrace();
    }
   }
  });
 
  setLayout(new BorderLayout());
  add(new JScrollPane(jta), BorderLayout.CENTER);
  add(jButton, BorderLayout.SOUTH);
  jta.append("Server started at count: " + count + "\n\n");

  setTitle("Exercise04s");
  setSize(500, 300);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setLocationRelativeTo(null);
  setVisible(true);
  
  try {
   // Create or open the count file
   raf = new RandomAccessFile("count.dat", "rw");

   // Get the count
   if (raf.length() == 0)
    count = 0;
   else
    count = raf.readInt();
   
   // Create a server socket
   @SuppressWarnings("resource")
   ServerSocket serverSocket = new ServerSocket(8000);   
   while (true) {    
    Socket socket = serverSocket.accept();    
    jta.append("Starting thread " + ClientNumber + "\n");
    ClientNumber++;
    InetAddress inetAddress = socket.getInetAddress();
    jta.append("Client IP " + inetAddress.getHostAddress() + "\n\n");
    HandleAClient task = new HandleAClient(socket);
    new Thread(task).start();
    
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
  
  
  
 }
 
 class HandleAClient implements Runnable {
  
  private Socket socket;
  
  public HandleAClient(Socket socket) {
   this.socket = socket;   
  }
  
  @Override
  public void run() {
   try {
    count++;
    DataOutputStream outputToClient = new DataOutputStream(socket.getOutputStream());
    outputToClient.writeInt(count);
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  
 }
}

import java.io.*;
import java.net.*;

import javax.swing.*;

public class Exercise04c extends JApplet {
 private static final long serialVersionUID = 1L;

 // Label for displaying the visit count
 private JLabel jlblCount = new JLabel();

 // Indicate if it runs as application
 private boolean isStandAlone = false;

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

 /** Initialize the applet */
 @SuppressWarnings("resource")
 public void init() {
  add(jlblCount);

  try {
   // Create a socket to connect to the server
   Socket socket;
   if (isStandAlone)
    socket = new Socket(host, 8000);
   else
    socket = new Socket(getCodeBase().getHost(), 8000);

   // Create an input stream to receive data from the server
   DataInputStream inputFromServer = new DataInputStream(
     socket.getInputStream());

   // Receive the count from the server and display it on label
   int count = inputFromServer.readInt();
   jlblCount.setText("You are visitor number " + count);

   // Close the stream
   inputFromServer.close();
  } catch (IOException ex) {
   ex.printStackTrace();
  }
 }

 /** Run the applet as an application */
 public static void main(String[] args) {
  // Create a frame
  JFrame frame = new JFrame("Exercise04c");

  // Create an instance of the applet
  Exercise04c applet = new Exercise04c();
  applet.isStandAlone = true;

  // Get host
  if (args.length == 1)
   applet.host = args[0];

  // Add the applet instance to the frame
  frame.add(applet, java.awt.BorderLayout.CENTER);

  // Invoke init() and start()
  applet.init();
  applet.start();

  // Display the frame
  frame.pack();
  frame.setLocationRelativeTo(null);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
 }
}

No comments:

Post a Comment