Как запустить клиентскую программу на фиксированном порту в 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
и для получения и отправки, и просто изменить данные.