mirror of
https://github.com/yanfeizhang/coder-kung-fu.git
synced 2026-11-05 07:07:24 +08:00
feat: add test code of 1 million tcp connection
This commit is contained in:
56
tests/network/test02/java/Client.java
Normal file
56
tests/network/test02/java/Client.java
Normal file
@@ -0,0 +1,56 @@
|
||||
import java.net.Socket;
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
public class Client {
|
||||
|
||||
public static final int MAX_CONNECTION_NUM = 50000;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if(3 != args.length){
|
||||
System.out.println("Usage: java Client <local ip> <server ip> <server port>\n");
|
||||
return;
|
||||
}
|
||||
|
||||
//1. 从命令行获取并解析local ip、server ip以及端口
|
||||
String lIp = args[0];
|
||||
String sIp = args[1];
|
||||
int sPort = Integer.parseInt(args[2]);
|
||||
|
||||
//2. 开始建立连接
|
||||
//用数组将 socket 保存起来,防止连接被过早释放
|
||||
Socket[] sockets = new Socket[MAX_CONNECTION_NUM];
|
||||
for(int i = 1; i <= MAX_CONNECTION_NUM; i++){
|
||||
try {
|
||||
Socket s = new Socket();
|
||||
s.bind(new InetSocketAddress(lIp, 0));
|
||||
s.connect(new InetSocketAddress(sIp, sPort));
|
||||
|
||||
if(false == s.isConnected()){
|
||||
System.out.println(lIp + " 连接 "+sIp+":"+sPort+" 失败! ");
|
||||
return;
|
||||
}
|
||||
sockets[i-1] = s;
|
||||
|
||||
} catch (Exception e) {
|
||||
//连接失败则小憩一会儿接着连
|
||||
Thread.sleep(500);
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
//稍稍停顿一下,避免把服务端的握手队列打满
|
||||
if(0 == i % 500){
|
||||
Thread.sleep(500);
|
||||
System.out.println(lIp + " 连接 "+sIp+":"+sPort+" 成功了 "+i+" 条");
|
||||
}
|
||||
}
|
||||
|
||||
//把所有连接都 hold 一会儿,方便观察
|
||||
Thread.sleep(300 * 1000);
|
||||
|
||||
//3. 释放所有的连接
|
||||
System.out.println("关闭所有的连接...\n");
|
||||
for(int i = 0; i < MAX_CONNECTION_NUM; i++){
|
||||
sockets[i].close();
|
||||
}
|
||||
}
|
||||
}
|
||||
38
tests/network/test02/java/Makefile
Normal file
38
tests/network/test02/java/Makefile
Normal file
@@ -0,0 +1,38 @@
|
||||
CLIENT_BINARY_NAME := "java Client"
|
||||
SERVER_BINARY_NAME := "java Server"
|
||||
|
||||
.PHONY: ping
|
||||
ping:
|
||||
sh tool.sh ping
|
||||
|
||||
.PHONY: ifup
|
||||
ifup:
|
||||
sh tool.sh ifup
|
||||
|
||||
.PHONY: ifdown
|
||||
ifdown:
|
||||
sh tool.sh ifdown
|
||||
|
||||
.PHONY: build-cli
|
||||
build-cli:
|
||||
javac Client.java
|
||||
|
||||
.PHONY: run-cli
|
||||
run-cli: build-cli
|
||||
sh tool.sh runcli $(CLIENT_BINARY_NAME)
|
||||
|
||||
.PHONY: stop-cli
|
||||
stop-cli:
|
||||
sh tool.sh stopcli
|
||||
|
||||
.PHONY: build-srv
|
||||
build-srv:
|
||||
javac Server.java
|
||||
|
||||
.PHONY: run-srv
|
||||
run-srv: build-srv
|
||||
sh tool.sh runsrv $(SERVER_BINARY_NAME)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -f *.class
|
||||
41
tests/network/test02/java/Server.java
Normal file
41
tests/network/test02/java/Server.java
Normal file
@@ -0,0 +1,41 @@
|
||||
import java.io.IOException;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
public class Server {
|
||||
public static final int MAX_CONNECTION_NUM = 1100000;
|
||||
|
||||
public static void main(String[] args) {
|
||||
if(2 != args.length){
|
||||
System.out.println("Usage: java Server <server ip> <server port>\n");
|
||||
return;
|
||||
}
|
||||
|
||||
String sIp = args[0];
|
||||
int sPort = Integer.parseInt(args[1]);
|
||||
|
||||
//用数组将 socket 保存起来,防止连接被过早回收
|
||||
Socket[] sockets = new Socket[MAX_CONNECTION_NUM];
|
||||
|
||||
try {
|
||||
ServerSocket ss = new ServerSocket();
|
||||
ss.bind(new InetSocketAddress(sIp, sPort));
|
||||
System.out.println("启动Server " + sIp + ":" + sPort + "...");
|
||||
|
||||
int i = 0;
|
||||
while(true){
|
||||
try{
|
||||
Socket s = ss.accept();
|
||||
sockets[i] = s;
|
||||
i++;
|
||||
System.out.println("Server " + sIp + ":" + sPort + " 接收到第 " + i +" 条连接!");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
83
tests/network/test02/java/tool.sh
Normal file
83
tests/network/test02/java/tool.sh
Normal file
@@ -0,0 +1,83 @@
|
||||
#!/bin/bash
|
||||
|
||||
#--------------------------- begin -------------------------
|
||||
#注意:这一部分的内容需要根据你自己的实验环境来设置
|
||||
|
||||
#1.客户端 IP 列表:选择20个,且不能在局域网中存在
|
||||
# 示例
|
||||
# IPS=(
|
||||
# "192.168.1.200"
|
||||
# "192.168.1.201"
|
||||
# )
|
||||
|
||||
IPS=(
|
||||
"192.168.1.200"
|
||||
"192.168.1.201"
|
||||
)
|
||||
|
||||
#2.客户端 IP 对应的子网掩码
|
||||
#示例:
|
||||
#NETMASK="255.255.248.0"
|
||||
NETMASK="255.255.248.0"
|
||||
|
||||
#3.服务端的 IP 和 端口
|
||||
#示例
|
||||
#SERVERIP="192.168.1.100"
|
||||
#SERVERPORT="8090"
|
||||
SERVERIP="192.168.1.100"
|
||||
SERVERPORT="8090"
|
||||
#--------------------------- end -------------------------
|
||||
|
||||
TYPE=$1
|
||||
|
||||
exec_ping(){
|
||||
for i in "${!IPS[@]}"; do
|
||||
ping -c 1 -W 1 ${IPS[$i]} > /dev/null
|
||||
if [[ $? != 0 ]];then
|
||||
echo ${IPS[$i]}" false"
|
||||
else
|
||||
echo ${IPS[$i]}" true"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
exec_ifup(){
|
||||
for i in "${!IPS[@]}"; do
|
||||
echo ifconfig eth0:$i ${IPS[$i]} netmask $NETMASK up
|
||||
ifconfig eth0:$i ${IPS[$i]} netmask $NETMASK up
|
||||
done
|
||||
}
|
||||
|
||||
exec_ifdown(){
|
||||
for i in "${!IPS[@]}"; do
|
||||
echo ifconfig eth0:$i down
|
||||
ifconfig eth0:$i down
|
||||
done
|
||||
}
|
||||
|
||||
exec_runcli(){
|
||||
for i in "${!IPS[@]}"; do
|
||||
echo $CLIENT ${IPS[$i]} $SERVERIP $SERVERPORT
|
||||
$CLIENT ${IPS[$i]} $SERVERIP $SERVERPORT &
|
||||
done
|
||||
}
|
||||
|
||||
exec_stopcli(){
|
||||
ps -ef | grep java | grep Client | awk '{print $2}' | xargs kill -9
|
||||
}
|
||||
|
||||
exec_runsrv(){
|
||||
echo $SERVER 0.0.0.0 $SERVERPORT
|
||||
$SERVER 0.0.0.0 $SERVERPORT
|
||||
}
|
||||
|
||||
case $TYPE in
|
||||
"ping") exec_ping;;
|
||||
"ifup") exec_ifup;;
|
||||
"ifdown") exec_ifdown;;
|
||||
"runcli") CLIENT=$2; exec_runcli;;
|
||||
"stopcli") CLIENT=$2; exec_stopcli;;
|
||||
"runsrv") SERVER=$2; exec_runsrv;;
|
||||
*) echo "get unkown type $TYPE"; exit ;;
|
||||
esac
|
||||
|
||||
Reference in New Issue
Block a user