当前位置: 首页 > 知识库问答 >
问题:

发送和接收UDP数据包?

佴英奕
2023-03-14
import java.io.IOException;
import java.net.*;

public class JavaApplication9 {    
    public static void main(String[] args) throws UnknownHostException, SocketException, IOException  {
        // TODO code application logic here
        byte[] buffer = {10,23,12,31,43,32,24};
        byte [] IP = {-64,-88,1,106};
        InetAddress address = InetAddress.getByAddress(IP);
        DatagramPacket packet = new DatagramPacket(
                buffer, buffer.length, address, 57
                );
        DatagramSocket datagramSocket = new DatagramSocket();
        datagramSocket.send(packet);
        System.out.println(InetAddress.getLocalHost().getHostAddress());
    }
}
public void run() {
    try {
        DatagramSocket serverSocket = new DatagramSocket(port);
        byte[] receiveData = new byte[8];
        byte[] sendData = new byte[8];

        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();
              String sendString = "polo";
              sendData = sendString.getBytes();
              DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
              serverSocket.send(sendPacket);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

共有1个答案

吕成业
2023-03-14

接收方必须将接收方的端口设置为与发送方DataGramPacket中设置的端口匹配。对于调试,请尝试监听大于1024的端口(例如8000或9000)。<1024的端口通常由系统服务使用,需要管理员访问才能绑定到这样的端口上。

如果接收者将数据包发送到它正在侦听的硬编码端口(例如端口57),并且发送者在同一台机器上,那么您将创建到接收者本身的环回。始终使用数据包中指定的端口,如果是生产软件,则在任何情况下都需要进行检查,以防止出现这种情况。

数据包无法到达目的地的另一个原因是发送方中指定的IP地址错误。与TCP不同,UDP会尝试发送数据包,即使地址不可达,发送方也不会收到错误指示。您可以通过打印接收器中的地址来检查这一点,作为调试的预防措施。

在您设置的发件人中:

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

但使用字符串形式的地址可能更简单:

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

换句话说,您将target设置为192.168.1.106。如果这不是接收器,那么您将无法获得数据包。

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
    }
}
 类似资料:
  • 本文向大家介绍python UDP(udp)协议发送和接收的实例,包括了python UDP(udp)协议发送和接收的实例的使用技巧和注意事项,需要的朋友参考一下 需要建立2个文件,一个作为客户端,一个作为服务端 文件一 作为客户端client,文件二作为服务端server udp的特点是不需要建立连接 文件一客户端 文件二服务端 注意:先运行文件二在运行文件一 以上这篇python UDP(ud

  • 我想使用Qt UDP(不是TCP)套接字传输文件。所以我这样写代码: 看来要传输的Qt UDP数据包的最小大小是8192字节。接收方总是得到第一个数据包,但不能接收其他数据包。 我对Qt和网络编程的经验很少,所以我不知道我的猜想对不对。你能告诉我如何改变这些代码来支持在第一个数据包之后接收数据包,这样我就可以传输大数据了吗?

  • 我需要在node.js中编写一个应用程序,它将一些UDP数据包发送到给定的IP地址和端口,并监听来自相同IP和端口的UDP数据包。我看到的其他示例似乎都提到了客户端和服务器体系结构,其中一边发送,另一边接收。我需要做两个在一个应用程序。 谢谢

  • 由于某种原因,我很难从同一套接字发送和接收数据。无论如何,这是我的客户端代码: 基本上,我想创建一个协议,我发送一个udp包,然后我期待一个响应。就像HTTP协议一样,每个请求都有一个响应。如果服务器在不同的计算机上,此代码可以工作。但是,可能会出现服务器和客户端在同一台计算机上的情况。 以下是服务器: 我不能使用tcp的原因是因为有时客户端在NAT(路由器)后面,并且做UDP打孔比TCP更简单。

  • 我不知道是网络配置还是我的软件出了问题。 这是监听代码: 奇怪的是,在wireshark上,我可以看到:数据包已从发送到,并且设备已对此数据包作出响应--来自的数据包已发送到。使用bind(0.0.0.0,端口)似乎不能涵盖。我迷路了,一点主意都没有。 ifconfig为:

  • 问题内容: 我正在使用套接字连接我的Android应用程序(客户端)和Java后端服务器。每次与服务器通信时,我都希望从客户端发送两个数据变量。 1)某种消息(由用户通过界面定义) 2)消息的语言(由用户通过界面定义) 我该如何发送这些消息,以便服务器将每个消息解释为一个单独的实体? 在读取了服务器端的数据并做出了适当的结论之后,我想向客户端返回一条消息。(我想我会没事的) 因此,我的两个问题是如