Как координировать отправку и получение с UDF DatagramSockets - PullRequest
1 голос
/ 22 июля 2011

У меня есть интеграционный тест, который должен координировать два DatagramSockets , каждый из которых работает в своем собственном потоке. Один сокет ожидает чтения данных с помощью блокирующего вызова метода receive (). Другой сокет должен вызвать send (), но это должно произойти после того, как receive () заблокирован, иначе данные будут потеряны.

Код выглядит примерно так:

Приемник

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

Sender

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

Я не хочу помещать Thread.sleep () перед вызовом send (), хотя этого, вероятно, будет достаточно, чтобы получатель мог блокироваться. Есть ли элегантный способ сделать это?

1 Ответ

1 голос
/ 22 июля 2011

Ожидание семафора непосредственно перед send (). Подайте сигнал единице непосредственно перед вызовом receive (). Учитывая сетевые задержки, я был бы удивлен, если бы ответ UDP вернулся до того, как был сделан вызов receive () и настроен сокет rx. Вы можете убедиться в этом, повысив приоритет принимающего потока (или снизив приоритет отправляющего потока).

Вы можете ждать другого семафора после send () и сигнализировать об этом после receive (), чтобы гарантировать, что поток отправки не будет пытаться отправить снова, пока rx не будет выполнен. Не уверен, как вы будете обнаруживать сбои связи, IIRC, ожидания семафора Java не имеют таймаута: ((

Rgds, Martin

...