gpt4 book ai didi

java - Jboss Netty - 无法连续发送数据?

转载 作者:行者123 更新时间:2023-12-01 17:35:30 25 4
gpt4 key购买 nike

使用 JBOSS Netty,我尝试将数据连续发送到连接的客户端。在下面的例子中,我尝试在客户端连接(channelConnected)后立即每 5 秒向客户端发送一次时间。

但这不起作用。仅当我评论 while 循环时它才有效。

    import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.codec.string.StringEncoder;

public class SRNGServer {

public static void main(String[] args) throws Exception {
// Configure the server.
ServerBootstrap bootstrap = new ServerBootstrap(
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));

// Configure the pipeline factory.
bootstrap.setPipelineFactory(new SRNGServerPipelineFactoryP());

// Bind and start to accept incoming connections.
bootstrap.bind(new InetSocketAddress(8080));
}



private static class SRNGServerHandlerP extends SimpleChannelUpstreamHandler {

private static final Logger logger = Logger.getLogger(SRNGServerHandlerP.class.getName());


@Override
public void channelConnected(
ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
// Send greeting for a new connection.
e.getChannel().write("Welcome to " + InetAddress.getLocalHost().getHostName() + "!\r\n");

while(true){
e.getChannel().write("It is " + new Date() + " now.\r\n");

Thread.sleep(1000*5);
}
}

@Override
public void exceptionCaught(
ChannelHandlerContext ctx, ExceptionEvent e) {
logger.log(
Level.WARNING,
"Unexpected exception from downstream.",
e.getCause());
e.getChannel().close();
}
}



private static class SRNGServerPipelineFactoryP implements ChannelPipelineFactory {

public ChannelPipeline getPipeline() throws Exception {

// Create a default pipeline implementation.
ChannelPipeline pipeline = Channels.pipeline();

pipeline.addLast("encoder", new StringEncoder());
pipeline.addLast("handler", new SRNGServerHandlerP());

return pipeline;
}
}

}

最佳答案

Netty 文档实际上指出,永远不应该让 Handler 等待,因为它最终可能会死锁。原因是处理程序方法是由 I/O 线程直接调用的。 Netty 中的一个 I/O 线程按顺序执行多个 I/O 操作,因此每个操作不是一个线程。在channelConnected 方法中,您应该使用对 channel 的引用启动一个新线程,并使该线程每 5 秒发送一次时间。这将为每个连接生成一个线程。或者,您可以让一个线程每 5 秒循环一次客户端列表,并按顺序向每个客户端发送时间。无论如何,使用与调用处理程序的线程不同的线程进行发送非常重要。

关于java - Jboss Netty - 无法连续发送数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6794576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com