Я планирую использовать Netty для разработки TCP-сервера. Когда клиент подключается, я должен немедленно начать прокачку
XML данные клиенту постоянно ... в течение нескольких часов / дней. Это так просто.
Итак, я переопределяю метод channelConnected и отправляю данные из этого метода, верно? ... это здорово.
Я буду использовать следующую ChannelFactory
ChannelFactory factory =
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool());
NioServerSocketChannelFactory
документация гласит
Рабочий поток выполняет неблокирующее чтение и запись для одного или нескольких каналов в неблокирующем режиме.
Хорошо.
В соответствии с действующим пунктом 51 Java: Не зависит от планировщика потока , я хочу, чтобы рабочий поток выполнил «единицу работы», а затем завершил / возвратил.
Таким образом, в моем случае, хотя я должен отправлять данные непрерывно, я хочу отправить некоторый кусок (скажем, 1 МБ), а затем выполнить (единицу выполненной работы), чтобы рабочий поток мог вернуться. Тогда я пришлю еще 1 МБ.
Ниже приведен пример из официального руководства Netty ЗДЕСЬ .
Я полагаю, что вопрос в этом случае, если бы мне пришлось безоговорочно продолжать посылать время клиенту, как бы я это сделал, учитывая
каждый отправить как единицу работы.
Один из способов сделать это - просто положить цикл while и выполнить Thread.Sleep. Любой другой путь?
package org.jboss.netty.example.time;
public class TimeServerHandler extends SimpleChannelHandler {
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
Channel ch = e.getChannel();
ChannelBuffer time = ChannelBuffers.buffer(4);
time.writeInt(System.currentTimeMillis() / 1000);
ChannelFuture f = ch.write(time);
f.addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
Channel ch = future.getChannel();
ch.close();
}
});
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
e.getCause().printStackTrace();
e.getChannel().close();
}
}