2011-08-25 67 views
3

我试图从UDP端口6610读取所有流量,并且我可以在Wireshark中看到数据包。我给这个简单的读者:简单的UDP阅读器

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)。 我错过了什么吗?

+0

你如何发送数据包?换句话说:*你期望它得到什么*? –

+0

您是否期望接收单播或广播UDP数据包? –

+0

@Joachim - 我是UDP的新手 - 我必须*发送*什么东西才能接收内容?我希望收到在这个端口发送的一切...... – Theodor

回答

1

它并不完全锁定在,它在。具体来说,它会在接收线上等待,直到出现问题。对于调试和测试的目的,你可以使用这样的:

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; 
    } 
} 

这通常不是一个坏主意,使用超时你的插座,这样可以防止您的应用程序无限期地等待。这对你来说是否合理取决于你的使用案例。

0

就像Joachim Sauer指出的那样,目标IP没有设置为我的IP。改变这个解决了我的问题。