如何使用UDF DatagramSockets协调发送和接收

时间:2011-07-21 21:26:59

标签: java multithreading sockets udp

我有一个集成测试需要协调两个DatagramSockets,每个都在自己的线程中运行。一个套接字等待通过阻塞调用receive()来读取数据。另一个套接字需要调用send(),但这必须在receive()被阻塞后发生,否则数据将丢失。

代码有点像这样:

接收机

byte[] buf = new byte[1024];
new DatagramSocket(7654).receive(new DatagramPacket(buf, buf.length));

发件人

new DatagramSocket(7654).send(
    new DatagramPacket("hello".getBytes(Charset.forName("UTF-8")), 5));

我不愿在send()调用之前放置一个Thread.sleep(),尽管这可能足以让接收器阻塞。是否有一种优雅的方式来做到这一点?

1 个答案:

答案 0 :(得分:1)

在send()之前等待信号量。在receive()调用之前发出一个单元的信号。鉴于网络延迟,如果UDP回复在进行receive()调用和rx套接字设置之前返回,我会感到惊讶。您可以通过提高接收线程的优先级来确保(或降低发送线程的优先级)。

您可以在send()之后等待另一个信号量,并在receive()之后发出信号,因此确保发送线程在rx完成之前不会再次尝试发送。不确定如何检测通信失败,IIRC,Java信号量等待没有超时:((

RGDS, 马丁