java - 如何使用 netty 5.0 创建大量连接

标签 java tcp netty nio

我想为测试目的创建大量客户端连接到服务器。我通过为每个连接创建线程来实现这一点,因此我只能在我的机器上创建 3000 个连接。下面是我的代码:

package com.stepnetwork.iot.apsclient.application;

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

/**
 * Created by sam on 3/22/16.
 */
public class DtuClient extends Thread {

    private static final String HOST = "192.168.54.36";
    private static final int PORT = 30080;
    private EventLoopGroup workerGroup;

    private String dtuCode;

    public DtuClient(String dtuCode, EventLoopGroup workerGroup) {
        this.dtuCode = dtuCode;
        this.workerGroup = workerGroup;
    }

    public void run() {

        Bootstrap bootstrap = new Bootstrap(); // (1)
        try {
            bootstrap.group(workerGroup); // (2)
            bootstrap.channel(NioSocketChannel.class); // (3)
            bootstrap.option(ChannelOption.SO_KEEPALIVE, true); // (4)
            bootstrap.handler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch) throws Exception {
                    ch.pipeline().addLast(new MyClientHandler());
                }
            });


            ChannelFuture feature = bootstrap.connect(HOST, PORT).sync();
            feature.addListener((future) -> {
                System.out.println(dtuCode + " connected to server");
                Channel channel = feature.channel();
                ByteBuf buffer = Unpooled.buffer(256);
                buffer.writeBytes(dtuCode.getBytes());
                channel.writeAndFlush(buffer);
            });

            feature.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("completed");
    }
}

我能获得更多连接吗?

我在谷歌搜索后尝试了另一种解决方案,但 channel 会自动关闭。

最佳答案

这是我的另一个解决方案

package com.stepnetwork.iot.apsclient.application;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by sam on 3/22/16.
 */
public class Test {

    private static final String HOST = "192.168.54.36";
    private static final int PORT = 30080;

    public static void main(String[] args) throws InterruptedException {
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        Bootstrap bootstrap = new Bootstrap(); // (1)
        try {
            bootstrap.group(workerGroup); // (2)
            bootstrap.channel(NioSocketChannel.class); // (3)
            bootstrap.option(ChannelOption.SO_KEEPALIVE, true); // (4)
            bootstrap.handler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch) throws Exception {
                    ch.pipeline().addLast(new MyClientHandler());
                }
            });


            List<Channel> channels = new ArrayList<>();

            // create many connection here, but the channel will be closed atomically
            for (int i = 0; i < 10000; i++) {
                channels.add(bootstrap.connect(HOST, PORT).sync().channel());
            }


        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        while (true) {
            Thread.sleep(Integer.MAX_VALUE);
        }
    }

}

关于java - 如何使用 netty 5.0 创建大量连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36150888/

相关文章:

windows - DLL 建立的 TCP 连接的 QoS

http - 数据包如何通过代理服务器到达目的地?

java - 移动应用程序 API 扩展策略

kotlin - 未调用 ktor 中的应用程序级事件

java - JSTL:用空格格式化字符串数字

java - android.view.View 无法转换为 android.support.v7.widget.RecyclerView

http - 我们可以使用 TLS over TCP 协议(protocol)吗?

java - 改变 GridLayout 的宽度

java - 发送大文件的最佳方式

java - 如何在 Netty 中使用多个 ServerBootstrap 对象