gpt4 book ai didi

java - Netty 因多个客户端连接而卡住

转载 作者:行者123 更新时间:2023-11-29 09:22:24 32 4
gpt4 key购买 nike

我正在尝试测试 netty,但是当我创建多个客户端连接到服务器时,一些客户端只是卡住并且永远不会完成。这是我的代码(基本上我使用了她的代码 https://github.com/brunodecarvalho/netty-tutorials 并修改它以使用多个客户端):


for (int i = numthr; i > 0; i--) {
Runnable runner = new Runnable() {
public void run() {
final Client client = new Client("localhost", 10400, nummes, 0);
if (!client.start()) {
System.exit(-1);
return;
}
client.flood();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
client.stop();
}
});
}
};
executor.execute(runner);
}

public void messageReceived(Envelope message) {

if (this.received.incrementAndGet() == this.messages) {

System.out.println(nmb.incrementAndGet());


}
}

public boolean start() {

// For production scenarios, use limited sized thread pools
this.clientFactory = new NioClientSocketChannelFactory(Executors.newCachedThreadPool(),
Executors.newCachedThreadPool(),1);
this.channelGroup = new DefaultChannelGroup(this + "-channelGroup");
this.handler = new ClientHandler(this, this.channelGroup);
ChannelPipelineFactory pipelineFactory = new ChannelPipelineFactory() {

@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("encoder", new Encoder());
pipeline.addLast("decoder", new Decoder());
pipeline.addLast("handler", handler);
return pipeline;
}
};

ClientBootstrap bootstrap = new ClientBootstrap(this.clientFactory);
bootstrap.setOption("reuseAddress", true);
bootstrap.setOption("tcpNoDelay", true);
bootstrap.setOption("keepAlive", true);
bootstrap.setPipelineFactory(pipelineFactory);


boolean connected = bootstrap.connect(new InetSocketAddress(host, port)).awaitUninterruptibly().isSuccess();
if (!connected) {
this.stop();
}

return connected;
}

this.serverFactory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),
Executors.newCachedThreadPool());
this.channelGroup = new DefaultChannelGroup(this + "-channelGroup");
ExecutionHandler executionHandler = new ExecutionHandler(
new MemoryAwareThreadPoolExecutor(270, 1048576, 1048576));

ServerBootstrap bootstrap = new ServerBootstrap(this.serverFactory);
bootstrap.setPipelineFactory(
new DatabaseGatewayPipelineFactory(executionHandler));
bootstrap.setOption("reuseAddress", true);
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
bootstrap.setOption("child.connectTimeoutMillis", 10000);

Channel channel = bootstrap.bind(new InetSocketAddress(this.host, this.port));
if (!channel.isBound()) {
this.stop();
return false;
}

this.channelGroup.add(channel);

最佳答案

代码每次都为 Client 创建新线程,具有相同的端口号。这可能会产生问题,因为多个线程正在同一端口上处理消息。

关于java - Netty 因多个客户端连接而卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5484010/

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