Java nio的一些问题
我决定用JavaNIO制作我的UDPclient和UDPserver。 但有几件事我不明白。 这是密码Java nio的一些问题,java,nio,Java,Nio,我决定用JavaNIO制作我的UDPclient和UDPserver。 但有几件事我不明白。 这是密码 try { DatagramChannel channel = DatagramChannel.open(); channel.configureBlocking(false); channel.connect(remote); //monitoring Selector selector = Selector.open(); //read write keys c
try {
DatagramChannel channel = DatagramChannel.open();
channel.configureBlocking(false);
channel.connect(remote);
//monitoring
Selector selector = Selector.open();
//read write keys
channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
ByteBuffer buffer = ByteBuffer.allocate(1024*64);//number of bytes for channel
while (true) {
selector.select(60000);//number of channels I think
Set readyKeys = selector.selectedKeys();
if (readyKeys.isEmpty()) {
break;
}
else {
Iterator iterator = readyKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
iterator.remove();
if (key.isReadable( )) {
//read from buffer
channel.read(buffer);
}
if (key.isWritable()) {
//write to buffer
channel.write(buffer);
}
}
}
}
}
catch (IOException ex) {
System.err.println(ex);
}
如果我在控制台中写入内容,将发生key.isWritable
中的事件?若服务器发送了一些可读取的事件,会发生吗?
我不知道当用户编写“GETL”或“REGR”(我自己的方法)时如何处理我的事件
select
的值是超时,而不是通道数DatagramChannel channelFromKey=(DatagramChannel)key.channel()代码>
频道
我不明白你说的你自己的事情是什么意思。选择该键时,从通道读取数据报
Iterator iterator = readyKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
iterator.remove();
if (key.isReadable( )) {
DatagramChannel channelFromKey =
(DatagramChannel) key.channel();
buffer.clear();
// This is a DatagramChannel receive a datagram as a whole
channelFromKey.receive(buffer);
}
如果我在控制台中写入内容,则key.isWritable中的事件将
发生了什么
否。将发生的唯一事件是在您已向选择器注册的频道上。您没有注册任何与控制台相关的频道,您也不能注册,因为只有网络频道是可选择的频道,因此您必须有理由预期来自控制台的事件会通过选择器出现
若服务器发送了一些可读取的事件,会发生吗
对
我不知道如何处理我的事件,例如用户
写“GETL”或“REGR”(我自己的方法)
我也不知道。我甚至不明白这个问题。您将从选择器中获得的唯一事件是它在您注册的频道上定义的事件。但是如果您不仅要从套接字读取,还要从BufferedReader.readline读取?您没有使用流式套接字。您正在使用数据报套接字。这意味着您的接收将是数据报数据包。ReadLine在这方面没有多大意义。事实上,BufferedReader在任何套接字上都没有多大意义。使用通道的想法是,不仅可以从套接字读取数据,还可以从键盘读取数据……因此,即使使用通道也不可能……啊,我明白了。您可能想查看策略模式,以及如何将其应用到您的用例中。