Java 使用DatagramPacket将数据从一个客户端发送到另一个客户端
我正在使用Datagramsocket和DatagramPacket制作一个简单的服务器客户端应用程序。 我想做的是:一个客户端将数据发送到服务器,服务器将这些数据发送到另一个客户端。问题是服务器从第一个客户端接收数据,但不将数据发送到另一个客户端,我如何知道要发送到的客户端端口??端口没有改变吗 这是客户端类:Java 使用DatagramPacket将数据从一个客户端发送到另一个客户端,java,datagram,Java,Datagram,我正在使用Datagramsocket和DatagramPacket制作一个简单的服务器客户端应用程序。 我想做的是:一个客户端将数据发送到服务器,服务器将这些数据发送到另一个客户端。问题是服务器从第一个客户端接收数据,但不将数据发送到另一个客户端,我如何知道要发送到的客户端端口??端口没有改变吗 这是客户端类: public class DatagramClient extends JFrame { private JTextField jtf = new JTextField(); pri
public class DatagramClient extends JFrame {
private JTextField jtf = new JTextField();
private JTextArea jta = new JTextArea();
private DatagramSocket socket;
private byte[] buf = new byte[256];
private InetAddress address;
private DatagramPacket sendPacket;
private DatagramPacket receivePacket;
public static void main(String[] args) {
new DatagramClient();
}
public DatagramClient() {
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
p.add(new JLabel("Enter radius"), BorderLayout.WEST);
p.add(jtf, BorderLayout.CENTER);
jtf.setHorizontalAlignment(JTextField.RIGHT);
setLayout(new BorderLayout());
add(p, BorderLayout.NORTH);
add(new JScrollPane(jta), BorderLayout.CENTER);
jtf.addActionListener(new ButtonListener()); // Register listener
setTitle("DatagramClient");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
try {
socket = new DatagramSocket();
address = InetAddress.getByName("localhost");
sendPacket =
new DatagramPacket(buf, buf.length, address, 8000);
receivePacket = new DatagramPacket(buf, buf.length);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
private class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
try {
Arrays.fill(buf, (byte)0);
sendPacket.setData(jtf.getText().trim().getBytes());
socket.send(sendPacket);
socket.receive(receivePacket);
jta.append("Radius is " + jtf.getText().trim() + "\n");
jta.append("Area received from the server is "
+ Double.parseDouble(new String(buf).trim()) + '\n');
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
服务器类:
public class DatagramServer extends JFrame {
private JTextArea jta = new JTextArea();
private byte[] buf = new byte[256];
public static void main(String[] args) {
new DatagramServer();
}
public DatagramServer() {
setLayout(new BorderLayout());
add(new JScrollPane(jta), BorderLayout.CENTER);
setTitle("DatagramServer");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
try {
DatagramSocket socket = new DatagramSocket(8000);
jta.append("Server started at " + new Date() + '\n');
DatagramPacket receivePacket =
new DatagramPacket(buf, buf.length);
DatagramPacket sendPacket ;
while (true) {
Arrays.fill(buf, (byte)0);
socket.receive(receivePacket);
jta.append("The client host name is "+receivePacket.getAddress().getHostAddress() +
" and port number is " + receivePacket.getPort() + '\n');
jta.append("Radius received from client is " +
new String(buf).trim() + '\n');
double radius = Double.parseDouble(new String(buf).trim());
double area = radius * radius * Math.PI;
jta.append("Area is " + area + '\n');
InetAddress addr=InetAddress.getByName("127.0.0.1");
sendPacket = new DatagramPacket(buf, buf.length);
sendPacket.setAddress(addr);
sendPacket.setData(new Double(area).toString().getBytes());
socket.send(sendPacket);
}
}
catch(IOException ex) {
ex.printStackTrace();
}
}
}我是这么想的——我没有运行您的代码并进行验证 从您的代码来看,客户端套接字似乎没有绑定到任何端口——我假设您的代码也用于其他客户端。基本上,如果UDP服务器(接收方)需要接收数据包(数据报),则必须将其绑定到端口,UDP客户端(发送方)必须在此端口上发送数据包。对于客户端的发送端,当您将数据包构建为“DatagramPacket(buf,buf.length,address,8000);”时,您可以正确地执行此操作 当服务器收到此数据包时,它会将数据包发送到本地主机(“127.0.0.1”),但您似乎没有指定此传出数据包的端口号。所以,你需要做两件事。首先,将客户机绑定到另一个端口(比如9000),然后将数据包的目标端口设为9000并发送它
顺便说一句,如果只有一个发送方和接收方,那么可以使用接收到的数据包“receivePacket.getPort()”中的端口号将响应反映回发送方。但是,由于您有两个客户机,因此无法使用此方法。因此,剩下的问题是确保第二个客户端也绑定到端口 @user2752385请您也上传新代码(请不要删除以前的代码)。我很乐意看一看,看看是否还有什么遗漏。我能问几个问题吗?有可能像这样从一个客户端发送到另一个客户端吗?我从2天后开始尝试,但是当服务器从最新代码发送到其他客户端时,程序挂起并且没有响应,我仍然看到客户端套接字没有绑定:“socket=new DatagramSocket();”。让我们一步一步地做。您能先将数据发送到服务器吗?一旦我们弄明白了这一点,我们应该考虑将响应从服务器发送回客户机。是的,客户机能够将数据发送到服务器。我知道是什么问题,但不知道如何解决。问题是客户端如何知道有数据发送给它??例如,服务器包含while循环来通知有数据发送。但是我如何在客户端做到这一点??