2016-04-04 205 views
0

我想了解UDP无连接客户端 - 服务器对。我在“计算机网络:自上而下”方法中获得了一些代码。 的方案如下: - UDPServer.java:如何在UDP无连接客户端 - 服务器对中在固定端口上运行客户端程序

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上的客户端。请帮助。

+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进行接收和发送,并且只是更改数据。

相关问题