Sending and receiving UDP packets?

前端 未结 1 825
花落未央
花落未央 2020-11-29 05:24

I have made a program to send an UDP packets from a client to a server.

Here is the transmitter code:

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


        
相关标签:
1条回答
  • 2020-11-29 06:01

    The receiver must set port of receiver to match port set in sender DatagramPacket. For debugging try listening on port > 1024 (e.g. 8000 or 9000). Ports < 1024 are typically used by system services and need admin access to bind on such a port.

    If the receiver sends packet to the hard-coded port it's listening to (e.g. port 57) and the sender is on the same machine then you would create a loopback to the receiver itself. Always use the port specified from the packet and in case of production software would need a check in any case to prevent such a case.

    Another reason a packet won't get to destination is the wrong IP address specified in the sender. UDP unlike TCP will attempt to send out a packet even if the address is unreachable and the sender will not receive an error indication. You can check this by printing the address in the receiver as a precaution for debugging.

    In the sender you set:

     byte [] IP= { (byte)192, (byte)168, 1, 106 };
     InetAddress address = InetAddress.getByAddress(IP);
    

    but might be simpler to use the address in string form:

     InetAddress address = InetAddress.getByName("192.168.1.106");
    

    In other words, you set target as 192.168.1.106. If this is not the receiver then you won't get the packet.

    Here's a simple UDP Receiver that works :

    import java.io.IOException;
    import java.net.*;
    
    public class Receiver {
    
        public static void main(String[] args) {
            int port = args.length == 0 ? 57 : Integer.parseInt(args[0]);
            new Receiver().run(port);
        }
    
        public void run(int port) {    
          try {
            DatagramSocket serverSocket = new DatagramSocket(port);
            byte[] receiveData = new byte[8];
            String sendString = "polo";
            byte[] sendData = sendString.getBytes("UTF-8");
    
            System.out.printf("Listening on udp:%s:%d%n",
                    InetAddress.getLocalHost().getHostAddress(), port);     
            DatagramPacket receivePacket = new DatagramPacket(receiveData,
                               receiveData.length);
    
            while(true)
            {
                  serverSocket.receive(receivePacket);
                  String sentence = new String( receivePacket.getData(), 0,
                                     receivePacket.getLength() );
                  System.out.println("RECEIVED: " + sentence);
                  // now send acknowledgement packet back to sender     
                  DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,
                       receivePacket.getAddress(), receivePacket.getPort());
                  serverSocket.send(sendPacket);
            }
          } catch (IOException e) {
                  System.out.println(e);
          }
          // should close serverSocket in finally block
        }
    }
    
    0 讨论(0)
提交回复
热议问题