【问题标题】:sending data from one client to another using DatagramPacket使用 DatagramPacket 从一个客户端向另一个客户端发送数据
【发布时间】:2013-09-11 23:56:26
【问题描述】:

我正在使用 Datagramsocket 和 DatagramPacket 制作一个简单的 server_client 应用程序。 我想要做的是:一个客户端将数据发送到服务器,服务器将这些数据发送到另一个客户端。问题是服务器从第一个客户端接收数据但不将它们发送到另一个客户端,我怎么知道我将发送到的客户端的端口?端口没有变化吗??

这是客户端类:

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

}

【问题讨论】:

    标签: java datagram


    【解决方案1】:

    这就是我的想法——我没有运行您的代码并进行验证。

    从您的代码来看,客户端套接字似乎没有绑定到任何端口——我假设您的代码也用于其他客户端。基本上,如果 UDP 服务器(接收方)需要接收一个数据包(数据报),那么它必须绑定到一个端口,并且 UDP 客户端(发送方)必须在这个端口上发送数据包。对于客户端的发送端,当您将数据包构建为“DatagramPacket(buf, buf.length, address, 8000);”时,您可以正确执行此操作。

    当服务器收到此数据包时,它会将数据包发送到本地主机(“127.0.0.1”),但您似乎没有指定此传出数据包的端口号。所以,你需要做两件事。首先,将客户端绑定到另一个端口(假设为 9000),然后将数据包的目标端口设为 9000 并发送。

    顺便说一句,如果您只有一个发送方和接收方,那么您可以使用接收到的数据包“receivePacket.getPort()”中的端口号将响应反映给发送方。但是,由于您有两个客户端,因此您不能使用此方法。因此,您需要确保第二个客户端也绑定到端口。

    【讨论】:

    • @user2752385 能否请您也上传新代码(请不要删除之前的代码)。我很乐意看一看,看看是否缺少其他东西。
    • 我能问几个问题吗?是否可以像这样从一个客户发送到另一个客户?我从 2 天开始就在尝试,但是当服务器发送到另一个客户端时程序挂起并且没有响应
    • 从您最新的代码中,我仍然看到客户端套接字未绑定:“socket = new DatagramSocket();”。让我们一步一步来。您可以先将数据发送到服务器吗?一旦我们弄清楚了,我们应该考虑将响应从服务器发送回客户端。
    • 是的,客户端可以向服务器发送数据。我知道问题出在哪里,但不知道如何解决。问题是客户端怎么知道有数据发送给它??
    • 例如,服务器包含while循环来通知有数据发送。但是我如何在客户端做到这一点??
    猜你喜欢
    • 2016-01-09
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2015-11-06
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多