DatagramChannel.receive()
I use a selector to manage the unblocking DatagramChannel,
When I got the event that I can read from the channel
(key.isReadable()==true),
I call this method.
What I wanna know is - Is this method perform an I/O operation
at lower-layer or just copy bits from a place in the memory.
If it is the former, do I need to use multithread to invoke receive()
to make better performance???
this is part of my code:
channel.configureBlocking(false);
selector = Selector.open();
SelectionKey key = channel.register(selector, channel.validOps());
while (run) {
selector.select(250);
if (key.isValid() && key.isReadable()) {
ByteBuffer buffer = ByteBuffer
.allocate(Constant.MAX_RECEIVE_BUFFER_SIZE);
buffer.order(ByteOrder.LITTLE_ENDIAN);
InetSocketAddress sock = (InetSocketAddress) channel
.receive(buffer);
if (sock == null)
continue;
receivedDatagramCount++;
log.info("received No." + receivedDatagramCount
+ " datagram");
String ip = sock.getAddress().getHostAddress();
int port = sock.getPort();
if (!Crypt.decrypt(buffer.array(), buffer.position())) {
log.warn("checksum error!");
return;
}
buffer.flip();
P2IHeaderInfo header = P2IHeaderInfo.getInstance(buffer);
buffer.rewind();
DispatchData data = new DispatchData(header, buffer, ip,
port, receivedDatagramCount);
Task task = new Task(Task.DISPATCH, data);
server.sendMessage(task);
}
if (key.isValid() && key.isWritable()) {
for(ToSendData data=resps.poll();data != null;data=resps.poll())
{
String ip = data.getIp();
int port = data.getPort();
ByteBuffer buffer = data.getBuffer();
Crypt.encrypt(buffer.array(), buffer.remaining());
byte[] x = new byte[buffer.remaining()];
System.arraycopy(buffer.array(), 0, x, 0, buffer
.remaining());
sendDatagramCount++;
log.info("Server sends No." + sendDatagramCount
+ " datagram: ");
StringUtil.printBytes(x);
channel.send(buffer, new InetSocketAddress(ip, port));
}
}
// }
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (selector != null) {
try {
selector.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (channel != null) {
try {
channel.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}