Re: DatagramChannel.receive()
resps is a ConcurrentLinkedQueue<ToSendData>
On 2=D4 1=C8=D5, =CF =CE=E71=CA=B109=B7=D6, lightning <huang.lightn...@g=
mail.com> wrote:
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, ch=
annel.validOps());
while (run) {
selector.select(250);
if (key.isValid() && key.isReadable()) {
ByteBuffer buffer = ByteBuffer
.allocate(Constant=
..MAX_RECEIVE_BUFFER_SIZE);
buffer.order(ByteOrder.LITTLE_ENDI=
AN);
InetSocketAddress sock = (InetSo=
cketAddress) channel
.receive(buffer);
if (sock == null)
continue;
receivedDatagramCount++;
log.info("received No." + received=
DatagramCount
+ " datagram");
String ip = sock.getAddress().ge=
tHostAddress();
int port = sock.getPort();
if (!Crypt.decrypt(buffer.array(),=
buffer.position())) {
log.warn("checksum error=
=A3=A1");
return;
}
buffer.flip();
P2IHeaderInfo header = P2IHeader=
Info.getInstance(buffer);
buffer.rewind();
DispatchData data = new Dispatch=
Data(header, buffer, ip,
port, receivedData=
gramCount);
Task task = new Task(Task.DISPAT=
CH, 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[buff=
er.remaining()];
System.arraycopy(buffer.ar=
ray(), 0, x, 0, buffer
.remaining=
());
sendDatagramCount++;
log.info("Server sends No.=
" + sendDatagramCount
+ " datagr=
am: ");
StringUtil.printBytes(x);
channel.send(buffer, new I=
netSocketAddress(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();
}
}
}