import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.util.Iterator; import java.util.Set; // for i in `seq 21 37`; do sudo ifconfig eth0:$i 192.168.1.$i up ; done // /etc/security/limits.conf // * - nofile 999999 // sudo sysctl -w net.ipv4.ip_local_port_range="1025 65535" // cat /proc/net/sockstat public class MakeupIdelConnection { final static int STEPS = 10; final static int connectionPerIP = 5000; public static void main(String[] args) throws IOException { final Selector selector = Selector.open(); InetSocketAddress locals[] = { new InetSocketAddress("127.0.0.1", 4348), // new InetSocketAddress("192.168.1.114", 9090), // new InetSocketAddress("192.168.1.21", 9090), // new InetSocketAddress("192.168.1.22", 9090), // new InetSocketAddress("192.168.1.23", 9090), // new InetSocketAddress("192.168.1.24", 9090), // new InetSocketAddress("192.168.1.25", 9090), // new InetSocketAddress("192.168.1.26", 9090), // new InetSocketAddress("192.168.1.27", 9090), // new InetSocketAddress("192.168.1.28", 9090), // new InetSocketAddress("192.168.1.29", 9090), // new InetSocketAddress("192.168.1.30", 9090), // new InetSocketAddress("192.168.1.31", 9090), // new InetSocketAddress("192.168.1.32", 9090), // new InetSocketAddress("192.168.1.33", 9090), // new InetSocketAddress("192.168.1.34", 9090), // new InetSocketAddress("192.168.1.35", 9090), // new InetSocketAddress("192.168.1.36", 9090), // new InetSocketAddress("192.168.1.37", 9090), }; // InetSocketAddress remote = new InetSocketAddress("192.168.1.114", // 9090); long start = System.currentTimeMillis(); int connected = 0; int currentConnectionPerIP = 0; while (true) { if (System.currentTimeMillis() - start > 1000 * 60 * 10) { break; } for (int i = 0; i < connectionPerIP / STEPS && currentConnectionPerIP < connectionPerIP; ++i, ++currentConnectionPerIP) { for (InetSocketAddress addr : locals) { SocketChannel ch = SocketChannel.open(); ch.configureBlocking(false); Socket s = ch.socket(); s.setReuseAddress(true); // s.bind(addr); ch.register(selector, SelectionKey.OP_CONNECT); ch.connect(addr); } } int select = selector.select(1000 * 10); // 10s if (select > 0) { System.out.println("select return: " + select + " events ; current connection per ip: " + currentConnectionPerIP); Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> it = selectedKeys.iterator(); while (it.hasNext()) { SelectionKey key = it.next(); if (key.isConnectable()) { SocketChannel ch = (SocketChannel) key.channel(); if (ch.finishConnect()) { ++connected; if (connected % (connectionPerIP * locals.length / 10) == 0) { System.out.println("connected: " + connected); } key.interestOps(SelectionKey.OP_READ); } } } selectedKeys.clear(); } } } }