@Slf4j
public class NettyClientTest
{
public static void main(String[] args) throws Exception
{
EventLoopGroup workerEventLoopGroup = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(workerEventLoopGroup)
.option(ChannelOption.SO_REUSEADDR, true)
.channel(NioSocketChannel.class)
.handler(new MyClientChannelInitializer());
List<Channel> channels = new ArrayList<>();
for( int i=0; i<60000; i++ ){ // 这里建立60000个连接,实验时建立了两万多个连接就报错了
log.info("count: {}", i);
channels.add(bootstrap.connect("localhost", 8080).sync().channel());
}
schedule(channels);
for( Channel channel : channels ){
channel.closeFuture().sync();
}
} finally {
// 6. 关闭工作线程组
workerEventLoopGroup.shutdownGracefully();
}
}
private static void schedule(List<Channel> channels){
// 启动一个线程来不断让客户发消息给服务端
new Thread(new MyScheduleRunnable(channels)).start();
}
private static class MyScheduleRunnable implements Runnable {
private List<Channel> channels;
private Random random = new Random();
public MyScheduleRunnable(List<Channel> channels)
{
this.channels = channels;
}
@Override
public void run() {
int seq = 0;
while(true){
try {
Thread.sleep(1000L);
int index = random.nextInt(channels.size());
Channel channel = channels.get(index);
// 调用channel.pipeline的方法写数据出去,channel是线程安全的
channel.pipeline().writeAndFlush(""+(seq++));
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
}
10-11
3055
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)