Проблема UDP-вещания - PullRequest
       28

Проблема UDP-вещания

0 голосов
/ 02 октября 2018

Я пытался решить простую проблему отправки случайных чисел с сервера на клиент по UDP Broadcasting.Насколько я знаю, если я буду транслировать по определенному 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

Сначала я запускаю сервер, используя вышеуказанный метод, затем Client.Я получаю NullPointerException для клиента.Было бы очень полезно, если бы я поняла, что я делаю здесь не так.

Я запускаю их в командном окне.Для сервера я получаю Сервер И для Клиента: Клиент

Редактировать: Мне удалось установить связь между Сервером и Клиентом.Тем не менее, я просто продолжаю получать только первый номер.Более того, если я инициализирую 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: Наконец, я сделал это работает.Просто поместите bout и pout в петлю for, и она должна работать!

1 Ответ

0 голосов
/ 02 октября 2018

вам нужно инициализировать 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

...