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
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());