Datagrams

   

Contents


Client.java

// Fig. 28.9: Client.java
// Client side of connectionless client/server computing with datagrams.
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Client extends JFrame 
{
   private JTextField enterField; // for entering messages
   private JTextArea displayArea; // for displaying messages
   private DatagramSocket socket; // socket to connect to server

   // set up GUI and DatagramSocket
   public Client()
   {
      super("Client");

      enterField = new JTextField("Type message here");
      enterField.addActionListener(
         new ActionListener() 
         { 
            public void actionPerformed(ActionEvent event)
            {
               try // create and send packet
               {
                  // get message from textfield 
                  String message = event.getActionCommand();
                  displayArea.append("\nSending packet containing: " +
                     message + "\n");

                  byte[] data = message.getBytes(); // convert to bytes
         
                  // create sendPacket
                  DatagramPacket sendPacket = new DatagramPacket(data, 
                     data.length, InetAddress.getLocalHost(), 5000);

                  socket.send(sendPacket); // send packet
                  displayArea.append("Packet sent\n");
                  displayArea.setCaretPosition(
                     displayArea.getText().length());
               } 
               catch (IOException ioException) 
               {
                  displayMessage(ioException + "\n");
                  ioException.printStackTrace();
               } 
            } 
         } 
      ); 

      add(enterField, BorderLayout.NORTH);

      displayArea = new JTextArea();
      add(new JScrollPane(displayArea), BorderLayout.CENTER);

      setSize(400, 300); // set window size
      setVisible(true); // show window

      try // create DatagramSocket for sending and receiving packets
      {
         socket = new DatagramSocket();
      } 
      catch (SocketException socketException) 
      {
         socketException.printStackTrace();
         System.exit(1);
      } 
   } 

   // wait for packets to arrive from Server, display packet contents
   public void waitForPackets()
   {
      while (true) 
      {
         try // receive packet and display contents
         {
            byte[] data = new byte[100]; // set up packet
            DatagramPacket receivePacket = new DatagramPacket(
               data, data.length);

            socket.receive(receivePacket); // wait for packet

            // display packet contents
            displayMessage("\nPacket received:" + 
               "\nFrom host: " + receivePacket.getAddress() + 
               "\nHost port: " + receivePacket.getPort() + 
               "\nLength: " + receivePacket.getLength() + 
               "\nContaining:\n\t" + new String(receivePacket.getData(), 
                  0, receivePacket.getLength()));
         } 
         catch (IOException exception) 
         {
            displayMessage(exception + "\n");
            exception.printStackTrace();
         } 
      } 
   }

   // manipulates displayArea in the event-dispatch thread
   private void displayMessage(final String messageToDisplay)
   {
      SwingUtilities.invokeLater(
         new Runnable()
         {
            public void run() // updates displayArea
            {
               displayArea.append(messageToDisplay);
            }
         }  
      ); 
   } 

   public static void main(String[] args)
   {
      Client application = new Client(); // create client
      application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      application.waitForPackets(); // run client application
   } 

}  


Server.java

// Fig. 28.7: Server.java
// Server side of connectionless client/server computing with datagrams.
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class Server extends JFrame 
{
   private JTextArea displayArea; // displays packets received
   private DatagramSocket socket; // socket to connect to client

   // set up GUI and DatagramSocket
   public Server()
   {
      super("Server");

      displayArea = new JTextArea(); // create displayArea
      add(new JScrollPane(displayArea), BorderLayout.CENTER);
      setSize(400, 300); // set size of window
      setVisible(true); // show window

      try // create DatagramSocket for sending and receiving packets
      {
         socket = new DatagramSocket(5000);
      } 
      catch (SocketException socketException) 
      {
         socketException.printStackTrace();
         System.exit(1);
      } 
   }

   // wait for packets to arrive, display data and echo packet to client
   public void waitForPackets()
   {
      while (true) 
      {
         try // receive packet, display contents, return copy to client
         {
            byte[] data = new byte[100]; // set up packet
            DatagramPacket receivePacket = 
               new DatagramPacket(data, data.length);

            socket.receive(receivePacket); // wait to receive packet

            // display information from received packet 
            displayMessage("\nPacket received:" + 
               "\nFrom host: " + receivePacket.getAddress() + 
               "\nHost port: " + receivePacket.getPort() + 
               "\nLength: " + receivePacket.getLength() + 
               "\nContaining:\n\t" + new String(receivePacket.getData(), 
                  0, receivePacket.getLength()));

            sendPacketToClient(receivePacket); // send packet to client
         } 
         catch (IOException ioException)
         {
            displayMessage(ioException + "\n");
            ioException.printStackTrace();
         } 
      } 
   }

   // echo packet to client
   private void sendPacketToClient(DatagramPacket receivePacket) 
      throws IOException
   {
      displayMessage("\n\nEcho data to client...");

      // create packet to send
      DatagramPacket sendPacket = new DatagramPacket(
         receivePacket.getData(), receivePacket.getLength(), 
         receivePacket.getAddress(), receivePacket.getPort());

      socket.send(sendPacket); // send packet to client
      displayMessage("Packet sent\n");
   }

   // manipulates displayArea in the event-dispatch thread
   private void displayMessage(final String messageToDisplay)
   {
      SwingUtilities.invokeLater(
         new Runnable() 
         {
            public void run() // updates displayArea
            {
               displayArea.append(messageToDisplay); // display message
            } 
         } 
      ); 
   } 

   public static void main(String[] args)
   {
      Server application = new Server(); // create server
      application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      application.waitForPackets(); // run server application
   } 

}


Maintained by John Loomis, updated Sun Apr 09 17:20:31 2017