gpt4 book ai didi

java - 使用数据报进行简单的客户端/服务器聊天数据包路由

转载 作者:行者123 更新时间:2023-12-01 15:16:25 24 4
gpt4 key购买 nike

所以我有 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

最佳答案

问题可能出在 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());

关于java - 使用数据报进行简单的客户端/服务器聊天数据包路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11535882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com