【问题标题】:UDP Broadcasting IssueUDP 广播问题
【发布时间】:2018-10-02 00:40:43
【问题描述】:

我正在尝试一个简单的问题,即通过 UDP 广播从服务器向客户端发送一些随机数。据我所知,如果我向特定的 IP 地址和端口号广播,则所有连接到该频道的用户都可以收听。我在互联网上寻找示例代码并基于此开发了我的代码。但是每当我尝试运行代码时,我的服务器会在客户端获取任何东西之前关闭套接字。

服务器代码是:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.security.SecureRandom;

public class Server {

  public static void main(String[] args) throws IOException {
      DatagramPacket packet;
      InetAddress address;
      DatagramSocket socket;

      System.out.println("Sending Numbers!");

      socket = new DatagramSocket();

      try {
          int n = 10;

          SecureRandom rand = new SecureRandom();
          address = InetAddress.getByName("233.0.0.1");

          for(int i = 0; i < n; i++)
          {
              int num = rand.nextInt(100);
              byte[] tmp = Integer.toString(num).getBytes();
              packet = new DatagramPacket (tmp, 0, address, 1502);
              socket.send(packet);
              System.out.println("Number has been sent!");
          }
      } catch (Exception e) {
          System.out.println("Error: " + e);
      } finally {
          try {
              socket.close();
          } catch (Exception e) {
              System.out.println("Error2: " + e);
          }
      }
  }
}

客户端代码为:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.nio.ByteBuffer;

public class Client {

  public static void main(String[] args) throws IOException {
      // Initialization
      int n = 10;

      // Create the socket
      int port = 1502;
      DatagramSocket socket;
      DatagramPacket packet = null;

      socket = new DatagramSocket(port);

      for (int i = 0; i < n; i++)
      {
          socket.receive (packet);
          byte[] numb = packet.getData();
          int num = ByteBuffer.wrap(numb).getInt();
          System.out.println(Integer.toString(num));
      }
  }

}

然后,我尝试使用 javac 和 java 编译每个代码。

javac Server.java
java package_name.Server

我首先使用上述方法运行服务器,然后是客户端。我得到客户端的 NullPointerException。如果我明白我在这里做错了什么,那将非常有帮助。

我在命令窗口中运行它们。对于服务器,我明白了 Server 对于客户:Client

编辑:我能够在服务器和客户端之间进行通信。但是,我只得到第一个数字。此外,如果我将Datagram 初始化为大小>2,我会得到NumberFormatException。这是改进后的代码。

服务器代码:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.security.SecureRandom;

public class Server {
  public static void main(String[] args) throws IOException {
      DatagramPacket packet;
      InetAddress address;
      DatagramSocket socket;

      System.out.println("Sending Numbers!");

      socket = new DatagramSocket();

      try {
          int n = 10;

          SecureRandom rand = new SecureRandom();
          address = InetAddress.getByName("127.0.0.1");

          ByteArrayOutputStream bout = new ByteArrayOutputStream();
          PrintStream pout = new PrintStream( bout );

          for(int i = 0; i < n; i++)
          {
              int num = rand.nextInt(100);
              pout.print(num);
              byte[] barray = bout.toByteArray();
              packet = new DatagramPacket (barray, barray.length, address, 1502);
              socket.send(packet);
              System.out.println("Number has been sent!");
              System.out.println(num);
          }
      } catch (Exception e) {
          System.out.println("Error: " + e);
      } finally {
          try {
              socket.close();
          } catch (Exception e) {
              System.out.println("Error2: " + e);
          }
      }
  }
}

客户代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Client {
  public static void main(String[] args) throws IOException {
      // Initialization
      int n = 10;

      // Create the socket
      int port = 1502;
      DatagramSocket socket;
      byte[] buf = new byte[2];
      DatagramPacket packet = new DatagramPacket(buf, buf.length);

      socket = new DatagramSocket(port);

      for (int i = 0; i < n; i++)
      {
          socket.receive (packet);
          int num = Integer.parseInt(new String(packet.getData()));
          System.out.println(num);
      }
  }
}

现在可能是什么问题?

编辑 2: 最后,我让它工作了。只需将boutpout 放在for 循环中,它应该可以工作!

【问题讨论】:

  • 客户端和服务器是否运行在同一台机器上?
  • @ScaryWombat 是的
  • 那么为什么不使用127.0.0.1呢?
  • 之前尝试使用 localhost。有同样的问题。我看到了一个示例代码,其中有人使用了这个 IP 地址并使用了那个。
  • 也看看java2s.com/Code/Java/Network-Protocol/… - 主要区别是他们使用了一个while循环

标签: java network-programming udp


【解决方案1】:

你需要在你的客户端初始化你的DatagramPacket - 它不能为空

     int n = 10;

      // Create the socket
      int port = 1502;
      DatagramSocket socket;
      byte[] buf = new byte[1000];
      DatagramPacket packet = new DatagramPacket(buf, buf.length);

      socket = new DatagramSocket(port);

      for (int i = 0; i < n; i++)
      {
          socket.receive (packet);
          byte[] numb = packet.getData();
          int num = ByteBuffer.wrap(numb).getInt();
          System.out.println(Integer.toString(num));
      } 

此代码还需要在您的 Server 之前运行

【讨论】:

  • 我已经取得了一些进展。我使用了Datagram 初始化。我也使用了 localhost ip。但是,我一直收到 0(或者至少是我转换为整数时命令窗口显示的内容)。你能告诉我原因吗?很抱歉回复晚了。我被其他一些事情困住了!
  • 首先,byte[] barray = bout.toByteArray(); bout 没有任何价值。其次,在byte[] buf = new byte[2]; 中,为什么将自己限制为两个字节 - 如果您将发送限制为两个字节,也许可以
  • 非常感谢您的帮助。我无法投票,因为我的声望少于 15 个
猜你喜欢
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 2010-12-16
  • 2012-03-07
  • 2016-02-25
  • 2013-05-15
相关资源
最近更新 更多