Как запустить клиентскую программу на фиксированном порту в UDP без соединения клиент-сервер пара в Java

Я пытаюсь понять UDP-клиент-сервер без соединения. Я получил некоторый код в Книге Компьютерные сети: нисходящий подход. Программы следующие: - UDPServer.java:

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

    class UDPServer
   {
       public static void main(String args[]) throws Exception
       {
        DatagramSocket serverSocket = new DatagramSocket(9876);
        byte[] receiveData = new byte[1024];
        byte[] sendData = new byte[1024];
        while(true)
        {
          DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);                   
          serverSocket.receive(receivePacket);
          String sentence = new String( receivePacket.getData());
          System.out.println("RECEIVED: " + sentence);
          InetAddress IPAddress = receivePacket.getAddress();
          int port = receivePacket.getPort();
          String capitalizedSentence = sentence.toUpperCase();
          sendData = capitalizedSentence.getBytes();
          DatagramPacket sendPacket =
          new DatagramPacket(sendData, sendData.length, IPAddress, port);                   
          serverSocket.send(sendPacket);
          }
      }
    }

UDPClient.java

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

В данном коде мы зафиксировали номер порта для Сервера, то есть 9876. Мне любопытно узнать, как исправить порт для Клиента, как мы это сделали для Сервера в данной Java-программе, чтобы сообщение могло быть возвращено Клиент на конкретном порту.

Например, если клиент отправит на сервер сообщение UDP, сервер запустится и запустится на порту 9876 и вернет исходное сообщение клиенту на порту 9877. Пожалуйста, помогите.

1 ответ

Решение

Вам не нужен фиксированный порт на клиенте, так же как клиенту не нужен фиксированный IP-адрес. Ваш собственный код уже должен работать правильно. Однако есть и другие проблемы:

String sentence = new String( receivePacket.getData());

Неправильно. Так должно быть String sentence = new String( receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());,

      System.out.println("RECEIVED: " + sentence);
      InetAddress IPAddress = receivePacket.getAddress();
      int port = receivePacket.getPort();
      String capitalizedSentence = sentence.toUpperCase();
      sendData = capitalizedSentence.getBytes();
      DatagramPacket sendPacket =
      new DatagramPacket(sendData, sendData.length, IPAddress, port);                   
      serverSocket.send(sendPacket);

Этот код отправит ответ обратно, откуда пришел запрос. Более простой способ - использовать тот же DatagramPacket и для получения и отправки, и просто изменить данные.

Другие вопросы по тегам