Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用UDF DatagramSockets协调发送和接收_Java_Multithreading_Sockets_Udp - Fatal编程技术网

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

Java 如何使用UDF DatagramSockets协调发送和接收,java,multithreading,sockets,udp,Java,Multithreading,Sockets,Udp,我有一个集成测试,需要协调两个,每个都在自己的线程中运行。一个套接字通过阻塞调用receive()等待读取数据。另一个套接字需要调用send(),但这必须在receive()被阻止后发生,否则数据将丢失 代码有点像这样: 接收器 byte[] buf = new byte[1024]; new DatagramSocket(7654).receive(new DatagramPacket(buf, buf.length)); new DatagramSocket(7654).send(

我有一个集成测试,需要协调两个,每个都在自己的线程中运行。一个套接字通过阻塞调用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));
发送方

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(),尽管这可能足以让接收方阻塞。有没有一种优雅的方法可以做到这一点?

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

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

Rgds,
Martin

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

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

Rgds,
Martin

UDP没有一种握手方法来协调这类工作。一个基本的解决方案是用等待“就绪”的数据包炸接收器一旦发送方收到确认信号,实际数据就会通过。我没有将此作为答案发布,因为我确信有人可以为您提供更好的方法。也许会有帮助?我也想到了。我希望有一种方法可以与Java并发工具相协调。UDP不会有一种握手方法来协调这类工作。一个基本的解决方案是用等待“就绪”的数据包来炸开接收器一旦发送方收到确认信号,实际数据就会通过。我没有将此作为答案发布,因为我确信有人可以向您指出一种更好的方法。也许会有帮助?我也想到了。我希望有一种方法可以与Java并发工具进行协调。这是proba很好,虽然它没有完全消除竞争条件。我不确定你所说的“UDP回复”是什么意思。目前,接收者没有向发送者发送响应。是可中断的,你可以指定超时。我似乎误解了-接收者没有发送回复什么“数据将丢失”?我假设没有对等方发送了UDP回复,如果接收线程没有等待,则堆栈将丢弃该回复。如果接收()失败,则从发送方发送到接收方的数据将丢失尚未调用。我知道您正在为测试中的通信模块创建存根,但单机上的生产设备是否共享内存?如果不共享,则信号量将仅适用于您的测试,这可能是生产中存在的并发性掩码问题。同样,忽略发送方/接收方是否在单机上机器共享内存,但我不明白为什么UDP是必要的,如果你是(只使用通过共享内存传递的消息和信号量)@TheCapn也许我应该提供更多的背景:)接收者是测试存根,发送者是生产代码。在真实环境中,我可以假设UDP接收者(在不同机器上运行的不同进程)将始终侦听,因此不需要进行协调。这可能已经足够好了,尽管它不能完全消除竞争条件。我不确定e你所说的“UDP回复”是什么意思。目前,接收方没有向发送方发送响应。这些响应是可中断的,你可以指定超时。我似乎误解了-如果接收方没有发送回复,那么什么是“数据将丢失”?我假设对等方发送了UDP回复,如果接收到响应,堆栈将丢弃该回复读取未等待。如果接收()失败,则从发送方发送到接收方的数据将丢失尚未调用。我知道您正在为测试中的通信模块创建存根,但单机上的生产设备是否共享内存?如果不共享,则信号量将仅适用于您的测试,这可能是生产中存在的并发性掩码问题。同样,忽略发送方/接收方是否在单机上机器共享内存,但我不明白为什么UDP是必要的,如果你是(只使用通过共享内存传递的消息和信号量)@TheCapn也许我应该提供更多的背景:)接收方是测试存根,发送方是生产代码。在真实环境中,我可以假设UDP接收方(在不同机器上运行的不同进程)将始终侦听,因此不需要协调。