diff --git a/tests/network/test02/c/Makefile b/tests/network/test02/c/Makefile new file mode 100644 index 0000000..ec9eda8 --- /dev/null +++ b/tests/network/test02/c/Makefile @@ -0,0 +1,39 @@ +CLIENT_BINARY_NAME := "test-client" +SERVER_BINARY_NAME := "test-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: + gcc client.c -o $(CLIENT_BINARY_NAME) + +.PHONY: run-cli +run-cli: build-cli + sh tool.sh runcli ./$(CLIENT_BINARY_NAME) + +.PHONY: stop-cli +stop-cli: + sh tool.sh stopcli ./$(CLIENT_BINARY_NAME) + +.PHONY: build-srv +build-srv: + gcc server.c -o $(SERVER_BINARY_NAME) + +.PHONY: run-srv +run-srv: build-srv + sh tool.sh runsrv ./$(SERVER_BINARY_NAME) + +.PHONY: clean +clean: + rm -f ${CLIENT_BINARY_NAME} + rm -f $(SERVER_BINARY_NAME) diff --git a/tests/network/test02/c/client.c b/tests/network/test02/c/client.c new file mode 100644 index 0000000..71fe73f --- /dev/null +++ b/tests/network/test02/c/client.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include +#include +#include + +#define MAX_CONNECTION_NUM 50000 + +int buildConnect(const char *lIp, const char *sIp, int sPort) +{ + int skFd; + if((skFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + printf("\n Error : Could not create socket\n"); + return 0; + } + + struct sockaddr_in cliAddr; + cliAddr.sin_family = AF_INET; + cliAddr.sin_addr.s_addr = inet_addr(lIp); + cliAddr.sin_port = 0; + if(bind(skFd, (struct sockaddr *)&cliAddr, sizeof(cliAddr)) < 0) + { + printf("\n Error : Bind Failed \n"); + } + + struct sockaddr_in srvAddr; + srvAddr.sin_family = AF_INET; + srvAddr.sin_addr.s_addr = inet_addr(sIp); + srvAddr.sin_port = htons(sPort); + if(connect(skFd, (struct sockaddr *)&srvAddr, sizeof(srvAddr)) < 0) + { + printf("\n Error : Connect Failed \n"); + return 0; + } + + return skFd; +} + +int main(int argc, char *argv[]) +{ + int i = 0, sPort, fd; + char lIp[16], sIp[16]; + + if(argc != 4) + { + printf("\n Usage: %s \n", argv[0]); + return 1; + } + + //1. 从命令行获取并解析local ip、server ip以及端口 + strcpy(lIp, argv[1]); + strcpy(sIp, argv[2]); + sPort = atoi(argv[3]); + + //2. 开始建立连接 + int *sockets = (int *)malloc(sizeof(int) * MAX_CONNECTION_NUM); + for(i = 1; i <= MAX_CONNECTION_NUM; i++) + { + if(0 == i % 1000) + {//稍稍停顿一下,避免把服务端的握手队列打满 + printf("%s 连接 %s:%d成功了 %d 条!\n", lIp, sIp, sPort, i); + sleep(1); + } + + fd = buildConnect(lIp, sIp, sPort); + if(fd > 0) + { + sockets[i-1] = fd; + }else{ + return 1; + } + } + sleep(300); + + //3. 释放所有的连接 + printf("关闭所有的连接...\n"); + for(i = 0; i < MAX_CONNECTION_NUM; i++) + { + close(sockets[i]); + } + + return 0; +} diff --git a/tests/network/test02/c/server.c b/tests/network/test02/c/server.c new file mode 100644 index 0000000..347a7a3 --- /dev/null +++ b/tests/network/test02/c/server.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include + +#define MAX_CONNECTION_NUM 1100000 + +int main(int argc, char *argv[]) +{ + char ip[16]; + int lisFd, conFd, port; + struct sockaddr_in servAddr; + + if(argc != 3) + { + printf("\n Usage: %s \n", argv[0]); + return 1; + } + + //1. 从命令行获取并解析server ip以及端口 + strcpy(ip, argv[1]); + port = atoi(argv[2]); + + //2. 创建server + if((lisFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + printf("\n Error : Could not create socket\n"); + return 0; + } + + servAddr.sin_family = AF_INET; + servAddr.sin_addr.s_addr = inet_addr(ip); + servAddr.sin_port = htons(port); + if(bind(lisFd, (struct sockaddr*)&servAddr, sizeof(servAddr)) < 0) + { + printf("\n Error : Bind Failed \n"); + } + if((listen(lisFd, 1024)) < 0) + { + printf("\n Error : Listen Failed \n"); + } + + //3. 接收连接 + int i = 0; + int *sockets = (int *)malloc(sizeof(int) * MAX_CONNECTION_NUM); + while(1) + { + conFd = accept(lisFd, (struct sockaddr*)NULL, NULL); + if(conFd > 0) + { + sockets[i++] = conFd; + printf("%s %d accept success:%d\n", ip, port, i); + } + } +} \ No newline at end of file diff --git a/tests/network/test02/c/tool.sh b/tests/network/test02/c/tool.sh new file mode 100644 index 0000000..5d3cf33 --- /dev/null +++ b/tests/network/test02/c/tool.sh @@ -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 $CLIENT | awk '{print $2}' | xargs kill -9 > /dev/null +} + +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 + diff --git a/tests/network/test02/clientd.php b/tests/network/test02/clientd.php deleted file mode 100755 index 067c144..0000000 --- a/tests/network/test02/clientd.php +++ /dev/null @@ -1,28 +0,0 @@ - clientd.log"); - -if(isset($argv[1]) && "stop"==$argv[1]){ - exit; -} - -foreach($ports as $port){ - $tCommand = "php client.php $serverIp $port >> clientd.log &"; - echo $tCommand."\n"; - shell_exec($tCommand); - sleep(1); -} - - - diff --git a/tests/network/test02/java/Client.java b/tests/network/test02/java/Client.java new file mode 100644 index 0000000..577df62 --- /dev/null +++ b/tests/network/test02/java/Client.java @@ -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 \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(); + } + } +} \ No newline at end of file diff --git a/tests/network/test02/java/Makefile b/tests/network/test02/java/Makefile new file mode 100644 index 0000000..df7a1a9 --- /dev/null +++ b/tests/network/test02/java/Makefile @@ -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 diff --git a/tests/network/test02/java/Server.java b/tests/network/test02/java/Server.java new file mode 100644 index 0000000..3e75002 --- /dev/null +++ b/tests/network/test02/java/Server.java @@ -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 \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(); + } + } +} diff --git a/tests/network/test02/java/tool.sh b/tests/network/test02/java/tool.sh new file mode 100644 index 0000000..f431d0b --- /dev/null +++ b/tests/network/test02/java/tool.sh @@ -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 + diff --git a/tests/network/test02/php/Makefile b/tests/network/test02/php/Makefile new file mode 100644 index 0000000..d0b6969 --- /dev/null +++ b/tests/network/test02/php/Makefile @@ -0,0 +1,23 @@ +.PHONY: ping +ping: + sh tool.sh ping + +.PHONY: ifup +ifup: + sh tool.sh ifup + +.PHONY: ifdown +ifdown: + sh tool.sh ifdown + +.PHONY: run-cli +run-cli: + sh tool.sh runcli + +.PHONY: stop-cli +stop-cli: + sh tool.sh stopcli + +.PHONY: run-srv +run-srv: + sh tool.sh runsrv diff --git a/tests/network/test02/php/client.php b/tests/network/test02/php/client.php new file mode 100644 index 0000000..8c50067 --- /dev/null +++ b/tests/network/test02/php/client.php @@ -0,0 +1,76 @@ + /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 php client.php ${IPS[$i]} $SERVERIP $SERVERPORT & + php client.php ${IPS[$i]} $SERVERIP $SERVERPORT & + done +} + +exec_stopcli(){ + ps -ef | grep client.php | awk '{print $2}' | xargs kill -9 +} + +exec_runsrv(){ + echo php server.php 0.0.0.0 $SERVERPORT + php server.php 0.0.0.0 $SERVERPORT +} + +case $TYPE in + "ping") exec_ping;; + "ifup") exec_ifup;; + "ifdown") exec_ifdown;; + "runcli") exec_runcli;; + "stopcli") exec_stopcli;; + "runsrv") exec_runsrv;; + *) echo "get unkown type $TYPE"; exit ;; +esac + diff --git a/tests/network/test02/ports.php b/tests/network/test02/ports.php deleted file mode 100644 index e254cbc..0000000 --- a/tests/network/test02/ports.php +++ /dev/null @@ -1,24 +0,0 @@ - serverd.log"); - -if(isset($argv[1]) && "stop"==$argv[1]){ - exit; -} - -foreach($ports as $port){ - $tCommand = "php server.php 0.0.0.0 $port >> serverd.log &"; - echo $tCommand."\n"; - shell_exec($tCommand); - sleep(1); -} - diff --git a/tests/network/test03/c/Makefile b/tests/network/test03/c/Makefile new file mode 100644 index 0000000..3c63333 --- /dev/null +++ b/tests/network/test03/c/Makefile @@ -0,0 +1,31 @@ +CLIENT_BINARY_NAME := "test-client" +SERVER_BINARY_NAME := "test-server" + +.PHONY: build-cli +build-cli: + gcc client.c -o $(CLIENT_BINARY_NAME) + +.PHONY: run-cli +run-cli: build-cli + sh tool.sh runcli ./$(CLIENT_BINARY_NAME) + +.PHONY: stop-cli +stop-cli: + sh tool.sh stopcli ./$(CLIENT_BINARY_NAME) + +.PHONY: build-srv +build-srv: + gcc server.c -o $(SERVER_BINARY_NAME) + +.PHONY: run-srv +run-srv: build-srv + sh tool.sh runsrv ./$(SERVER_BINARY_NAME) + +.PHONY: stop-srv +stop-srv: + sh tool.sh stopsrv ./$(SERVER_BINARY_NAME) + +.PHONY: clean +clean: + rm -f ${CLIENT_BINARY_NAME} + rm -f $(SERVER_BINARY_NAME) diff --git a/tests/network/test03/c/client.c b/tests/network/test03/c/client.c new file mode 100644 index 0000000..f17cb8d --- /dev/null +++ b/tests/network/test03/c/client.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +#include + + +#define MAX_CONNECTION_NUM 50000 + +int buildConnect(const char *sIp, int sPort) +{ + int skFd; + if((skFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + printf("\n Error : Could not create socket\n"); + return 0; + } + + struct sockaddr_in srvAddr; + srvAddr.sin_family = AF_INET; + srvAddr.sin_addr.s_addr = inet_addr(sIp); + srvAddr.sin_port = htons(sPort); + if(connect(skFd, (struct sockaddr *)&srvAddr, sizeof(srvAddr)) < 0) + { + printf("\n Error : Connect Failed \n"); + return 0; + } + + return skFd; +} + +int main(int argc, char *argv[]) +{ + int i = 0, sPort, fd; + char sIp[16]; + + if(argc != 3) + { + printf("\n Usage: %s \n", argv[0]); + return 1; + } + + //1. 从命令行获取并解析server ip以及端口 + strcpy(sIp, argv[1]); + sPort = atoi(argv[2]); + + //2. 开始建立连接 + int *sockets = (int *)malloc(sizeof(int) * MAX_CONNECTION_NUM); + for(i = 1; i <= MAX_CONNECTION_NUM; i++) + { + if(0 == i % 1000) + {//稍稍停顿一下,避免把服务端的握手队列打满 + printf("连接 %s:%d成功了 %d 条!\n", sIp, sPort, i); + sleep(1); + } + + fd = buildConnect(sIp, sPort); + if(fd > 0) + { + sockets[i-1] = fd; + }else{ + return 1; + } + } + sleep(300); + + //3. 释放所有的连接 + printf("关闭所有的连接...\n"); + for(i = 0; i < MAX_CONNECTION_NUM; i++) + { + close(sockets[i]); + } + + return 0; +} diff --git a/tests/network/test03/c/server.c b/tests/network/test03/c/server.c new file mode 100644 index 0000000..8734d6f --- /dev/null +++ b/tests/network/test03/c/server.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include + +#define MAX_CONNECTION_NUM 1100000 + +int main(int argc, char *argv[]) +{ + char ip[16]; + int lisFd, conFd, port; + struct sockaddr_in servAddr; + + if(argc != 3) + { + printf("\n Usage: %s \n", argv[0]); + return 1; + } + + //1. 从命令行获取并解析server ip以及端口 + strcpy(ip, argv[1]); + port = atoi(argv[2]); + + //2. 创建server + if((lisFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + printf("\n Error : Could not create socket\n"); + return 0; + } + + servAddr.sin_family = AF_INET; + servAddr.sin_addr.s_addr = inet_addr(ip); + servAddr.sin_port = htons(port); + if(bind(lisFd, (struct sockaddr*)&servAddr, sizeof(servAddr)) < 0) + { + printf("\n Error : Bind Failed \n"); + } + if((listen(lisFd, 1024)) < 0) + { + printf("\n Error : Listen Failed \n"); + } + + //3. 接收连接 + int i = 0; + int *sockets = (int*)malloc(sizeof(int) * MAX_CONNECTION_NUM); + while(1) + { + conFd = accept(lisFd, (struct sockaddr*)NULL, NULL); + if(conFd > 0) + { + sockets[i++] = conFd; + printf("%s %d accept success:%d\n", ip, port, i); + } + } +} \ No newline at end of file diff --git a/tests/network/test03/c/tool.sh b/tests/network/test03/c/tool.sh new file mode 100644 index 0000000..085e1ff --- /dev/null +++ b/tests/network/test03/c/tool.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +#--------------------------- begin ------------------------- +#注意:这一部分的内容需要根据你自己的实验环境来设置 + +#1.服务端的 IP +#示例 +#SERVERIP="192.168.1.100" +SERVERIP="192.168.1.100" + +#2.服务端的端口 +SERVERPORTS=( + "8100" + "8101" + "8102" + "8103" + "8104" + "8105" + "8106" + "8107" + "8108" + "8109" + "8110" + "8111" + "8112" + "8113" + "8114" + "8115" + "8116" + "8117" + "8118" + "8119" +) +#--------------------------- end ------------------------- + +TYPE=$1 + +exec_runcli(){ + for i in "${!SERVERPORTS[@]}"; do + echo $CLIENT $SERVERIP ${SERVERPORTS[$i]} & + $CLIENT $SERVERIP ${SERVERPORTS[$i]} & + done +} + +exec_stopcli(){ + ps -ef | grep $CLIENT | awk '{print $2}' | xargs kill -9 +} + +exec_runsrv(){ + for i in "${!SERVERPORTS[@]}"; do + echo $SERVER 0.0.0.0 ${SERVERPORTS[$i]} & + $SERVER 0.0.0.0 ${SERVERPORTS[$i]} & + done +} + +exec_stopsrv(){ + ps -ef | grep $SERVER | awk '{print $2}' | xargs kill -9 +} + +case $TYPE in + "runcli") CLIENT=$2; exec_runcli;; + "stopcli") CLIENT=$2; exec_stopcli;; + "runsrv") SERVER=$2; exec_runsrv;; + "stopsrv") SERVER=$2; exec_stopsrv;; + *) echo "get unkown type $TYPE"; exit ;; +esac + diff --git a/tests/network/test03/java/Client.java b/tests/network/test03/java/Client.java new file mode 100644 index 0000000..789ea29 --- /dev/null +++ b/tests/network/test03/java/Client.java @@ -0,0 +1,53 @@ +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(2 != args.length){ + System.out.println("Usage: java Client \n"); + return; + } + + //1. 从命令行获取并解析local ip、server ip以及端口 + String sIp = args[0]; + int sPort = Integer.parseInt(args[1]); + + //2. 开始建立连接 + //用数组将 socket 保存起来,防止连接被过早释放 + Socket[] sockets = new Socket[MAX_CONNECTION_NUM]; + for(int i = 1; i <= MAX_CONNECTION_NUM; i++){ + try { + Socket s = new Socket(); + s.connect(new InetSocketAddress(sIp, sPort)); + + if(false == s.isConnected()){ + System.out.println(" 连接 "+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("连接 "+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(); + } + } +} \ No newline at end of file diff --git a/tests/network/test03/java/Makefile b/tests/network/test03/java/Makefile new file mode 100644 index 0000000..6528be8 --- /dev/null +++ b/tests/network/test03/java/Makefile @@ -0,0 +1,30 @@ +CLIENT_BINARY_NAME := "java Client" +SERVER_BINARY_NAME := "java Server" + +.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: stop-srv +stop-srv: + sh tool.sh stopsrv + +.PHONY: clean +clean: + rm -f *.class diff --git a/tests/network/test03/java/Server.java b/tests/network/test03/java/Server.java new file mode 100644 index 0000000..3671465 --- /dev/null +++ b/tests/network/test03/java/Server.java @@ -0,0 +1,42 @@ +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 \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(); + } + } +} diff --git a/tests/network/test03/java/tool.sh b/tests/network/test03/java/tool.sh new file mode 100644 index 0000000..efdd9c9 --- /dev/null +++ b/tests/network/test03/java/tool.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +#--------------------------- begin ------------------------- +#注意:这一部分的内容需要根据你自己的实验环境来设置 + +#1.服务端的 IP +#示例 +#SERVERIP="192.168.1.100" +SERVERIP="192.168.1.100" + +#2.服务端的端口 +SERVERPORTS=( + "8100" + "8101" + "8102" + "8103" + "8104" + "8105" + "8106" + "8107" + "8108" + "8109" + "8110" + "8111" + "8112" + "8113" + "8114" + "8115" + "8116" + "8117" + "8118" + "8119" +) +#--------------------------- end ------------------------- + +TYPE=$1 + +exec_runcli(){ + for i in "${!SERVERPORTS[@]}"; do + echo $CLIENT $SERVERIP ${SERVERPORTS[$i]} & + $CLIENT $SERVERIP ${SERVERPORTS[$i]} & + done +} + +exec_stopcli(){ + ps -ef | grep java | grep Client | awk '{print $2}' | xargs kill -9 +} + +exec_runsrv(){ + for i in "${!SERVERPORTS[@]}"; do + echo $SERVER 0.0.0.0 ${SERVERPORTS[$i]} & + $SERVER 0.0.0.0 ${SERVERPORTS[$i]} & + done +} + +exec_stopsrv(){ + ps -ef | grep java | grep Server | awk '{print $2}' | xargs kill -9 +} + +case $TYPE in + "runcli") CLIENT=$2; exec_runcli;; + "stopcli") exec_stopcli;; + "runsrv") SERVER=$2; exec_runsrv;; + "stopsrv") exec_stopsrv;; + *) echo "get unkown type $TYPE"; exit ;; +esac + diff --git a/tests/network/test03/php/Makefile b/tests/network/test03/php/Makefile new file mode 100644 index 0000000..cfa94da --- /dev/null +++ b/tests/network/test03/php/Makefile @@ -0,0 +1,15 @@ +.PHONY: run-cli +run-cli: + sh tool.sh runcli + +.PHONY: stop-cli +stop-cli: + sh tool.sh stopcli + +.PHONY: run-srv +run-srv: + sh tool.sh runsrv + +.PHONY: stop-srv +stop-srv: + sh tool.sh stopsrv diff --git a/tests/network/test02/client.php b/tests/network/test03/php/client.php old mode 100755 new mode 100644 similarity index 87% rename from tests/network/test02/client.php rename to tests/network/test03/php/client.php index a747b68..e86333c --- a/tests/network/test02/client.php +++ b/tests/network/test03/php/client.php @@ -16,9 +16,9 @@ $sockets = array(); function buildConnect($sIp,$sPort,$num){ global $sockets; - for($i=0;$i<$num;$i++){ - if(0==$i%1000){ - echo $i."\n"; + for($i = 1; $i <= $num; $i++){ + if(0 == $i % 1000){ + echo " 连接 ".$sIp.":".$sPort." 成功了 ".$i." 条\n"; sleep(1); } diff --git a/tests/network/test03/php/server.php b/tests/network/test03/php/server.php new file mode 100644 index 0000000..5efba2d --- /dev/null +++ b/tests/network/test03/php/server.php @@ -0,0 +1,50 @@ +