Java 简单UDP读取器

Java 简单UDP读取器,java,udp,Java,Udp,我正在尝试读取UDP端口6610的所有流量,我可以在Wireshark中看到数据包。我做了一个简单的读者: public class ReceiveUDP extends Thread { private int port = 6610; private byte[] buffer = new byte[256]; private DatagramSocket socket; private DatagramPacket packet; public ReceiveUDP() throws

我正在尝试读取UDP端口6610的所有流量,我可以在Wireshark中看到数据包。我做了一个简单的读者:

public class ReceiveUDP extends Thread {

private int port = 6610;
private byte[] buffer = new byte[256];
private DatagramSocket socket;
private DatagramPacket packet;

public ReceiveUDP() throws SocketException {
    socket = new DatagramSocket(port);
    packet = new DatagramPacket(buffer, buffer.length);
    System.out.println("Succesfull socket / packet creation");
}

@Override
public void run() {
    try {
        socket.receive(packet);
        System.out.println("Succeded!");
    } catch (IOException e) {
        System.out.println("Failed to receive packet"+e.getCause().getMessage());
    }
}

public static void main(String[] args) throws SocketException {
    new ReceiveUDP().start();
}
打印输出为:

Succesfull socket / packet creation
也就是说,脚本锁定在socket.receive(packet)上。
我错过了什么吗?

它没有完全锁定
receive()
,它阻塞了
receive()
。具体地说,它将在接收线上等待,直到出现某种情况。为了进行调试和测试,您可以使用以下方法:

socket.setSoTimeout(5000); // Block for max 5 seconds

while (true) {
   try {
      s.receive(packet);
      System.out.println("Succeded!");
      break;
   } catch (SocketTimeoutException ste) {
      // Timeout reached, log this and try again.
      // Possibly keep track of the total number of tries and give up 
      // (break) if it exceeds a threshold.
      System.out.println("Timeout reached, will try again");
   } catch (IOException iox) {
      System.out.println("I/O Error: " + iox.getMessage());
      break;
   }
}

在套接字上使用超时通常不是一个坏主意,这可以防止应用程序无限期地等待。当然,这对您的应用程序是否有意义取决于您的用例

正如Joachim Sauer指出的,目标IP没有设置为我的IP。更改此选项解决了我的问题。

如何发送数据包?换句话说:您希望它接收什么?您希望接收单播或广播UDP数据包吗?@Joachim-我是UDP新手-我必须发送一些信息才能接收到一些信息吗?我希望在这个端口上收到所有发送的东西…@Theodor:不,你不需要发送一些东西来接收一些东西。但总得有人派人来接你。您是否希望收到特定的流量?向该流量发送数据的第三方程序?因为如果没有任何东西发送到UDP端口,那么你的程序的行为很容易解释:它完全按照它的设计来做。@Steve-我怎么知道?