Re: Retrieving Sender Information From A Non-blocking DatagramChannel
On 24.10.2011 21:14, Bala wrote:
I have a DatagramChannel that I have added to a Java Selector. Hence
the configureblocking is set to false since the selector expects a non
blockign socket.
I have to use the DatagramChannel's receive call and cannot use the
socket.receive which reads the data in a packet due to the nonblocking
mode.
If I would have received / sent DatagramPacket using the
dc.socket().receive call, then the packet provides you the Sender
information anyways.
The problem is that I need the host/port of the sender from this
DatagramChannel. I see there are a couple of private variables within
the DatagramChannel class cachedSenderInetAddress, cachedSenderPort)
that have this information but those are private variables and I do
not see any method in the DatagramChannel or its socket to retrieve
the sender information.
Is there a way I can do this?
Here is the code snippet for the Receiver
=========================================
class CReadDatagramChannel {
DatagramChannel dc = DatagramChannel.open().configureBlocking(false);
public CReadDatagramChannel (int port, Selector selector) {
dc.socket().setReuseAddress(true);
dc.socket().bind(new InetSocketAddress(port));
dc.register(selector, SelectionKey.OP_READ, this);
}
/* This method gets invoked from the Selector on the isReadable() */
public void processRead () {
// I cannot do dc.socket().receive(packet) since the blocking is
false.
ByteBuffer socketBuffer = ByteBuffer.allocate(1024);
dc.receive (socketBuffer);
You're almost there:
"Returns:
The datagram's source address, or null if this channel is in
non-blocking mode and no datagram was immediately available"
http://download.oracle.com/javase/6/docs/api/java/nio/channels/DatagramChannel.html#receive(java.nio.ByteBuffer)
In other words: you just need to change the line into
final SocketAddress sender = dc.receive(socketBuffer);
and be done.
}
}
Here is the code snippet for the Sender
=======================================
class CWriteDatagramChannel {
DatagramChannel dc = DatagramChannel.open().configureBlocking(false);
public CWriteDatagramChannel (int port, Selector selector) {
dc.socket().setReuseAddress(true);
dc.socket().bind(new InetSocketAddress(port));
dc.register(selector, SelectionKey.OP_READ, this);
}
/* This method gets invoked from the Selector on the isWritable() */
pubic void processWrite (ByteBuffer writeBuffer, String host, int
port) {
// I cannot do dc.socket().write since the blocking is false.
dc.send(writeBuffer, new InetSocketAddress (host, port));
}
}
Is there a way to know the Sender after the receive call in the
Reader?
See above.
Kind regards
robert
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/