You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2012/08/17 19:05:07 UTC
svn commit: r1374360 -
/cxf/trunk/rt/transports/udp/src/main/java/org/apache/cxf/transport/udp/UDPConduit.java
Author: dkulp
Date: Fri Aug 17 17:05:07 2012
New Revision: 1374360
URL: http://svn.apache.org/viewvc?rev=1374360&view=rev
Log:
Mina (actually, the JDK nio) cannot do req/resp multicast
Modified:
cxf/trunk/rt/transports/udp/src/main/java/org/apache/cxf/transport/udp/UDPConduit.java
Modified: cxf/trunk/rt/transports/udp/src/main/java/org/apache/cxf/transport/udp/UDPConduit.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/udp/src/main/java/org/apache/cxf/transport/udp/UDPConduit.java?rev=1374360&r1=1374359&r2=1374360&view=diff
==============================================================================
--- cxf/trunk/rt/transports/udp/src/main/java/org/apache/cxf/transport/udp/UDPConduit.java (original)
+++ cxf/trunk/rt/transports/udp/src/main/java/org/apache/cxf/transport/udp/UDPConduit.java Fri Aug 17 17:05:07 2012
@@ -27,6 +27,7 @@ import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.InterfaceAddress;
+import java.net.MulticastSocket;
import java.net.NetworkInterface;
import java.net.URI;
import java.util.Enumeration;
@@ -162,7 +163,7 @@ public class UDPConduit extends Abstract
s = s.substring(0, s.indexOf('/'));
}
int port = Integer.parseInt(s);
- sendViaBroadcast(message, port);
+ sendViaBroadcast(message, null, port);
} else {
InetSocketAddress isa = null;
String hp = "";
@@ -170,6 +171,11 @@ public class UDPConduit extends Abstract
isa = new InetSocketAddress(uri.getHost(), uri.getPort());
hp = uri.getHost() + ":" + uri.getPort();
+ if (isa.getAddress().isMulticastAddress()) {
+ sendViaBroadcast(message, isa, isa.getPort());
+ return;
+ }
+
Queue<ConnectFuture> q = connections.get(hp);
ConnectFuture connFuture = null;
if (q != null) {
@@ -191,51 +197,71 @@ public class UDPConduit extends Abstract
}
}
- private void sendViaBroadcast(Message message, int port) {
+ private void sendViaBroadcast(Message message, InetSocketAddress isa, int port) {
message.setContent(OutputStream.class,
- new UDPBroadcastOutputStream(port, message));
+ new UDPBroadcastOutputStream(port, isa, message));
}
private final class UDPBroadcastOutputStream extends LoadingByteArrayOutputStream {
private final int port;
private final Message message;
+ private final InetSocketAddress multicast;
- private UDPBroadcastOutputStream(int port, Message message) {
+ private UDPBroadcastOutputStream(int port, InetSocketAddress isa, Message message) {
this.port = port;
this.message = message;
+ this.multicast = isa;
}
public void close() throws IOException {
super.close();
DatagramSocket socket;
- socket = new DatagramSocket();
+ if (multicast != null) {
+ socket = new MulticastSocket(null);
+ } else {
+ socket = new DatagramSocket();
+ }
socket.setSendBufferSize(this.size());
socket.setReceiveBufferSize(64 * 1024);
socket.setBroadcast(true);
- Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
- while (interfaces.hasMoreElements()) {
- NetworkInterface networkInterface = interfaces.nextElement();
- if (!networkInterface.isUp() || networkInterface.isLoopback()) {
- continue;
- }
- for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
- InetAddress broadcast = interfaceAddress.getBroadcast();
- if (broadcast == null) {
- continue;
+
+ if (multicast != null) {
+ Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
+ while (interfaces.hasMoreElements()) {
+ NetworkInterface networkInterface = interfaces.nextElement();
+ if (!networkInterface.isUp() || networkInterface.isLoopback()) {
+ continue;
}
- DatagramPacket sendPacket = new DatagramPacket(this.getRawBytes(),
- 0,
- this.size(),
- broadcast,
- port);
-
- try {
- socket.send(sendPacket);
- } catch (Exception e) {
- //ignore
+ for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
+ InetAddress broadcast = interfaceAddress.getBroadcast();
+ if (broadcast == null) {
+ continue;
+ }
+ DatagramPacket sendPacket = new DatagramPacket(this.getRawBytes(),
+ 0,
+ this.size(),
+ broadcast,
+ port);
+
+ try {
+ socket.send(sendPacket);
+ } catch (Exception e) {
+ //ignore
+ }
}
}
+ } else {
+ DatagramPacket sendPacket = new DatagramPacket(this.getRawBytes(),
+ 0,
+ this.size(),
+ multicast);
+
+ try {
+ socket.send(sendPacket);
+ } catch (Exception e) {
+ //ignore
+ }
}
if (!message.getExchange().isOneWay()) {