首先介绍HTTPS(含HTTP)的测试工具类,共有4个,代码如下:
public class HttpsRequestRunnable implements Runnable {
private static Logger logger = LoggerFactory.getLogger(HttpsRequestRunnable.class);
private static final LongAdder counter = new LongAdder();
private String server_url ;
private String strReqJson ;
private String userId ;
private String token ;
public HttpsRequestRunnable(String server_url, String userId, String token,String strReqJson) {
this.server_url = server_url ;
this.strReqJson = strReqJson ;
this.userId = userId ;
this.token = token ;
}
public void run() {
String respStr = HttpsRequestUtil.getFromHttps(server_url, userId, token, strReqJson);
logger.info("respStr:{}",respStr);
counter.increment();
if(counter.intValue()%10==1) {
logger.error("{} resContent {} ", counter.intValue(),respStr);
}
}
}
public class HttpsRequestUtil {
private static Logger logger = LoggerFactory.getLogger(HttpsRequestUtil.class);
private static HttpURLConnection getConn(String server_url) throws Exception {
URL url = new URL(server_url);
if(server_url.toLowerCase().startsWith("https")) {
HttpsURLConnection.setDefaultHostnameVerifier(new NullHostNameVerifier());
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tm, /*new java.security.SecureRandom()*/null);
SSLSocketFactory ssf = sslContext.getSocketFactory();
conn.setSSLSocketFactory(ssf);
return conn ;
}
return (HttpURLConnection) url.openConnection();
}
public static String getFromHttps(String server_url,String userId,String token,String strReqJson) {
String CONTENT_TYPE = "application/json";
StringBuilder sb2 = new StringBuilder();
try {
HttpURLConnection conn = getConn(server_url);
conn.setConnectTimeout(45 * 1000);
conn.setReadTimeout(45 * 1000);
conn.setDoInput(true);// 允许输入
conn.setDoOutput(true);// 允许输出
conn.setUseCaches(false); // 不允许使用缓存
conn.setRequestMethod("POST");
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("charset", "UTF-8");
conn.setRequestProperty("Content-Type", CONTENT_TYPE);
conn.setRequestProperty("userId", userId);
conn.setRequestProperty("token", token);
DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
if(StringUtil.isNotEmpty(strReqJson)) {
outStream.write(strReqJson.getBytes());
}
outStream.flush();
outStream.close();
conn.connect();
InputStream in = null;
int resCode = conn.getResponseCode();
logger.debug("resCode {} ", resCode);
if (resCode == 200) {
in = conn.getInputStream();
int ch;
while ((ch = in.read()) != -1) {
sb2.append((char) ch);
}
}
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return sb2.toString();
}
}
public class MyX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
class NullHostNameVerifier implements HostnameVerifier {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
}
然后是HTTP/HTTPS单元测试类(其实完全可以将testLocalHttpLogin的内容放入一个普通类的main方法中运行):
@SpringBootTest
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class HttpLocalFunctionTest {
private static Logger logger = LoggerFactory.getLogger(HttpLocalFunctionTest.class);
@Test
public void testLocalHttpLogin() throws Exception {
logger.info("begin2test_testLogin");
//可以支持http和https
String SERVER_URL = "http://127.0.0.1:8888/login" ;
String SERVER_URL = "https://127.0.0.1:8888/login" ;
String reqJson = "{\"name\":\"张三\",\"id\":0}";
String userId = StringUtil.getRandomCode(5);
String token = StringUtil.getRandomCode(15);
Thread t = new Thread(new HttpsRequestRunnable(SERVER_URL, userId,token, reqJson));
t.start();
t.join();
}
}
接下来是WebSocket的模拟客户端。
需要引入 java_websocket.jar,pom.xml 如下:
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>J