Search code examples
javasocketsdatagram

simple client/server chat packet routing using Datagram


so i have 3 clients and 1 server that should route the messages to the correct client. the client send a message along with the name of the other client that should get the message. and server should compare the name of the receiving client and replace the correct IP in the packet and send the message to the correct client. the problem is that the server doesn't replace the IP so the message is not delivered. Please help me to fix the prblem. here is my server code:

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 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
   private String[] message; 
   private String pcName, pc1, pc2, pc3;
   private InetAddress clientIPAddress, nextClient;

   // 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 );
  } // end try
  catch ( SocketException socketException ) 
  {
     socketException.printStackTrace();
     System.exit( 1 );
  } // end catch
  } // end Server constructor

 // 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
        clientIPAddress = receivePacket.getAddress();
        byte[] msgByte = receivePacket.getData();
        String str = new String(msgByte);
        String[] words = str.split(" ");  

         pcName= words[words.length-1];


        if (pcName.equals(pc1)){
            nextClient=  InetAddress.getByName("192.168.1.19");
            }
        else if (pcName.equals(pc2)) 
        {
        nextClient=  InetAddress.getByName("192.168.1.18");
        } else{
            nextClient=  InetAddress.getByName("192.168.1.17");
            }


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

        sendPacketToClient( receivePacket, nextClient ); // send packet to client
     } // end try
     catch ( IOException ioException )
     {
        displayMessage( ioException + "\n" );
        ioException.printStackTrace();
     } // end catch
  } // end while
 } // end method waitForPackets

  // echo packet to client
  private void sendPacketToClient( DatagramPacket receivePacket, 
  InetAddress nextClient) 
  throws IOException
    {

    displayMessage( "\n\nsending data to client:"+pcName +
          "\nIP:" + clientIPAddress );

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

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

    // 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
        } // end method run
     } // end anonymous inner class
  ); // end call to SwingUtilities.invokeLater
  } // end method displayMessage
} // end class Server

Solution

  • Might the problem be this line in sendPacketToClient

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

    You should probably be putting the resolved InetAddress in the new packet instead of the one you got from the sending client.

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