所以我有3个客户端和1个服务器应该将消息路由到正确的客户端。客户端发送消息以及应该获取消息的其他客户端的名称。和服务器应比较接收客户端的名称,并替换数据包中的正确IP,并将消息发送到正确的客户端。问题是服务器不替换IP,因此消息不会传递。请帮我解决问题。这是我的服务器代码:
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
答案 0 :(得分:1)
问题可能是sendPacketToClient
// create packet to send
DatagramPacket sendPacket = new DatagramPacket(receivePacket.getData(),
receivePacket.getLength(),
clientIPAddress,
receivePacket.getPort());
您可能应该将已解析的InetAddress
放入新数据包而不是您从发送客户端获取的数据包。
// create packet to send
DatagramPacket sendPacket = new DatagramPacket(receivePacket.getData(),
receivePacket.getLength(),
nextClient,
receivePacket.getPort());