2016-04-04 3 views
0

Я пытаюсь понять пару клиент-сервер UDP без установления соединения. У меня есть код в книге Computer Computer Networking: A Top Down Approach. Программы следующим образом: - UDPServer.java:Как запустить клиентскую программу на фиксированном порту в UDP-сервере без подключения к серверу в 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. I мне интересно узнать, как исправить порт для Клиента, как мы это делали для сервера в данной java-программе, чтобы сообщение могло быть возвращено клиенту в конкретном порту.

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

+0

Ничего не мешает вам привязываться к определенному порту при создании объекта «DatagramSocket» на клиенте, как и на «сервере». –

+0

Большое спасибо. Я об этом не думал. Теперь он работает так, как я хотел. – Nazgul

+0

Обратите внимание, что если вы привязываете «клиент» к определенному порту, вы можете использовать только один клиент на компьютер. Если вы хотите протестировать несколько клиентов, вам нужно использовать несколько компьютеров. –

ответ

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