Нужно отправить UDP-пакет и получить ответ на Java

Я должен отправить пакет UDP и получить ответ от сервера UDP. Хотя UDP был аналогичен java.net.DatagramPacket в Java, но документация для DatagramPacket, похоже, заключается в том, что вы отправляете пакет, но ничего не получаете обратно, правильно ли это использовать или я должен использовать java. сеть.Socket


person Paul Taylor    schedule 19.12.2011    source источник
comment
UDP — это дейтаграмма. Вы ничего не получите обратно, если получатель не отправит что-то обратно. То же самое с сокетом tcp. Если вы расскажете нам, что вы хотите сделать, может быть?   -  person Erik    schedule 19.12.2011
comment
Хорошо, сервер уже существует (не написан мной), он должен отправить что-то обратно, когда я отправляю ему пакет, но как мне получить пакет, который он отправляет обратно?   -  person Paul Taylor    schedule 19.12.2011
comment
первый вопрос: сервер отправляет udp обратно? Если это так, вам нужно прочитать из собственного UDP-сокета с помощью метода Datagram.receive().   -  person Erik    schedule 19.12.2011
comment
Макс ответил ниже спасибо.   -  person Paul Taylor    schedule 19.12.2011


Ответы (4)


Пример отправки и получения дейтаграмм UDP (источник):

import java.io.*;
import java.net.*;

class UDPClient
{
   public static void main(String args[]) throws Exception
   {
      BufferedReader inFromUser =
         new BufferedReader(new InputStreamReader(System.in));
      DatagramSocket clientSocket = new DatagramSocket();
      InetAddress IPAddress = InetAddress.getByName("localhost");
      byte[] sendData = new byte[1024];
      byte[] receiveData = new byte[1024];
      String sentence = inFromUser.readLine();
      sendData = sentence.getBytes();
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
      clientSocket.send(sendPacket);
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
      clientSocket.receive(receivePacket);
      String modifiedSentence = new String(receivePacket.getData());
      System.out.println("FROM SERVER:" + modifiedSentence);
      clientSocket.close();
   }
}
person bezmax    schedule 19.12.2011
comment
Это выглядит хорошо, но похоже, что для сервера не определена длина пакета, т.е. я не думаю, что длина пакета, возвращаемого сервером, всегда одинакова, поэтому мне просто нужно убедиться, что буфер ReceiveData достаточно большой, чтобы обрабатывать максимально возможный размер пакета. - person Paul Taylor; 19.12.2011
comment
да. UDP является ненадежным протоколом и редко используется для отправки по нему больших блоков данных. Однако после получения пакета вы можете прочитать фактическое количество байтов, содержащихся в DatagramPacket.getLength(). - person bezmax; 19.12.2011
comment
receivePacket.getData() содержит не только полученные данные. Он также содержит неиспользуемую часть буфера. Чтобы получить строку с полученными данными, используйте new String(receivePacket.getData(), 0, receivePacket.getLength(), StandardCharsets.UTF_8) и настройте кодировку в соответствии с вашими ожиданиями. - person Augustus Kling; 19.04.2015
comment
Просто хотел подтвердить, что приемлема отправка/получение с использованием одного и того же объекта сокета? Я читал другой вопрос, в котором пользователь был непреклонен в том, что должен быть один сокет для получения и другой для отправки, хотя это кажется невозможным, если им нужно использовать один и тот же порт (вы получите исключение). - person The Unknown Dev; 17.06.2017

Вы должны использовать DatagramPacket и DatagramSocket. Когда вы отправляете пакет, вы просто отправляете пакет. Однако, когда вы получаете пакет, вы можете получить пакет, который был отправлен из другой программы (например, ответ сервера)

http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html

Socket предназначен только для TCP-соединений.

person Peter Lawrey    schedule 19.12.2011

Документация по Java описывает, как написать клиент и сервер.

http://docs.oracle.com/javase/tutorial/networking/datagrams/clientServer.html

Вы хотите просмотреть DatagramSocket#получить

person ptomli    schedule 19.12.2011

Именно в этом разница между сокетами UDP и TCP.

UDP является широковещательным, тогда как TCP с java.net.Socket является двухточечным. UDP работает по принципу «выстрелил и забыл», аналогично публикации сообщения в теме JMS.

См.: http://docs.oracle.com/javase/tutorial/networking/datagrams/index.html

person wrschneider    schedule 19.12.2011
comment
UDP не передается. Широковещательная передача — это вещь на уровне IP. - person OrangeDog; 14.07.2017
comment
Может быть, точнее сказать, что TCP может быть отправлен только одному получателю, а UDP может быть отправлен нескольким. См. также: stackoverflow.com/questions/21266008/ - person wrschneider; 06.11.2018