JavaDemo——java的HttpServer简单使用
JAVA 简单 JavaDemo 使用
2023-09-11 14:16:28 时间
Demo1:
/**
* 2019年8月16日上午9:49:10
*/
package testHttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.URI;
import com.sun.net.httpserver.HttpContext;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
/**
* @author XWF
*
*/
public class TestHttpServer {
/**
* @param args
*/
public static void main(String[] args) {
try {
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);//监听8080端口,第二个参数小于等于0使用默认值,表示可同时接受请求的个数
// HttpServer server = HttpServer.create();
// server.bind(new InetSocketAddress(8080), 0);
server.createContext("/start", new StartHandler());
// HttpContext context = server.createContext("/start");//需要后面设置handler
// context.setHandler(new StartHandler());
// server.removeContext(context);//移除context
// server.removeContext("/start");//移除context
server.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
server.stop(1000);//停止服务,所有handler处理完或者超时(依据最先触发者停止),关闭所有连接,并且server不能被重新使用
} catch (IOException e) {
e.printStackTrace();
}
}
}
class StartHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
System.out.println("getProtocol:" + exchange.getProtocol());//协议版本
System.out.println("getRequestMethod:" + exchange.getRequestMethod());//请求方法GET、POST
System.out.println("getResponseCode:" + exchange.getResponseCode());//返回已经设置的响应code,还没设置返回-1
HttpContext context = exchange.getHttpContext();
System.out.println("context.getPath:" + context.getPath());
System.out.println("context.toString:" + context.toString());
System.out.println("context.getAttributes:" + context.getAttributes());
System.out.println("context.getAuthenticator:" + context.getAuthenticator());
System.out.println("context.getFilters:" + context.getFilters());
System.out.println("context.getHandler:" + context.getHandler());
System.out.println("context.getServer:" + context.getServer());
System.out.println("getLocalAddress:" + exchange.getLocalAddress());
System.out.println("getPrincipal:" + exchange.getPrincipal());
System.out.println("getRemoteAddress:" + exchange.getRemoteAddress());
URI uri = exchange.getRequestURI();
System.out.println("getRequestURI:" + exchange.getRequestURI());
System.out.println("uri.getAuthority:" + uri.getAuthority());
System.out.println("uri.getFragment:" + uri.getFragment());
System.out.println("uri.getHost:" + uri.getHost());
System.out.println("uri.getPath:" + uri.getPath());
System.out.println("uri.getQuery:" + uri.getQuery());//url里get请求的参数
System.out.println("uri.getRawAuthority:" + uri.getRawAuthority());
System.out.println("uri.getRawFragment:" + uri.getRawFragment());
System.out.println("uri.getRawPath:" + uri.getRawPath());
System.out.println("uri.getRawQuery:" + uri.getRawQuery());
System.out.println("uri.getRawSchemeSpecificPart:" + uri.getRawSchemeSpecificPart());
System.out.println("uri.getRawUserInfo:" + uri.getRawUserInfo());
System.out.println("uri.getScheme:" + uri.getScheme());
System.out.println("uri.getSchemeSpecificPart:" + uri.getSchemeSpecificPart());
System.out.println("uri.getUserInfo:" + uri.getUserInfo());
System.out.println("uri.getPort:" + uri.getPort());
System.out.println("getRequestBody:" + exchange.getRequestBody());
System.out.println("getResponseBody:" + exchange.getResponseBody());
System.out.println("getResponseHeaders:" + exchange.getResponseHeaders());
exchange.sendResponseHeaders(200, 0);//len>0:响应体必须发送指定长度;len=0:可发送任意长度,关闭OutputStream即可停止;len=-1:不会发响应体;
System.out.println("ResponseCode:" + exchange.getResponseCode());
exchange.close();//先关闭打开的InputStream,再关闭打开的OutputStream
}
}
网页输入:http://127.0.0.1:8080/start?x=10&y=20
结果:
Demo2:
/**
* 2019年8月16日下午2:08:03
*/
package testHttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.URLDecoder;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
/**
* @author XWF
*
*/
public class TestHttpServer2 {
/**
* @param args
*/
public static void main(String[] args) {
try {
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/form", new FormHttpHandler());
server.createContext("/info", new InfoHttpHandler());
server.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public static Map<String, String> getParams(String paramStr){
if(paramStr != null) {
return Stream.of(paramStr.split("&"))
.filter(s -> s.split("=").length == 2 && s.split("=")[0].length() > 0 && s.split("=")[1].length() > 0)
.collect(Collectors.toMap(x -> x.toString().split("=")[0], y -> y.toString().split("=")[1]));
}
return null;
}
}
class FormHttpHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
System.out.println("from方法:" + exchange.getRequestMethod());//get
String paramStr = exchange.getRequestURI().getQuery();
System.out.println("get参数:" + TestHttpServer2.getParams(paramStr));
exchange.sendResponseHeaders(200, 0);
String body = "<!DOCTYPE html>"
+ "<head>"
+ "<meta charset='utf-8'>"
+ "<title>FromPage</title>"
+ "</head>"
+ "</body>"
+ "<form action='info' method='post'>"
+ "abc:<input type='text' name='abc'/><br/>"
+ "def:<input type='text' name='def'/><br/>"
+ "<input type='submit' value='测试'/>"
+ "</form>"
+ "</body>";
exchange.getResponseBody().write(body.getBytes());
exchange.close();
}
}
class InfoHttpHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
System.out.println("info方法:" + exchange.getRequestMethod());//post
String bodyStr = new String(exchange.getRequestBody().readAllBytes());
bodyStr =URLDecoder.decode(bodyStr,"UTF-8");
System.out.println("post收到:" + TestHttpServer2.getParams(bodyStr));
exchange.sendResponseHeaders(200, 0);
exchange.getResponseBody().write("success".getBytes());
exchange.close();
}
}
网页输入:http://127.0.0.1:8080/form?a=1&b=2
填入:
点击“测试”提交表单:
后台结果:
2019-10-16 补充:
默认是单线程处理,处理过程中阻塞,后面的请求也不会处理了;
可以在HttpServer加入线程池处理:
ThreadPoolExecutor executor = new ThreadPoolExecutor(1000, 3000, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1000));
server.setExecutor(executor);
//或者
server.setExecutor(Executors.newCachedThreadPool());
相关文章
- mybatis简单案例源码详细【注释全面】——实体层(Role.java)
- java使用循环案例——CSDN博客
- Java 简单校验框架
- Java中简单易懂的HashMap面试题(面试必备)
- Java实现 LeetCode 90 子集 II(二)
- java算法集训代码填空题练习1
- java实现 蓝桥杯 算法训练 安慰奶牛
- Java中Vector类的常用方法
- Java实现 蓝桥杯VIP 算法提高 打水问题
- Java实现 蓝桥杯 历届试题 核桃的数量
- 最简单的JAVA解析XML字符串方法
- 泥瓦匠 5 年 Java 的成长感悟(下)
- 【JAVA】java中的length和length()
- Java NIO框架--Netty4的简单示例
- java Socket实现简单在线聊天(三)
- java.lang.OutOfMemoryError: PermGen space基于idea,MyEclipse或tomcat的详细解决方法以及详解JVM配置参数
- Java中this和super的用法总结
- JAVA语言之Java 中不同的并行实现的性能比较
- 【java】Java并发编程系列-基础知识(非常详细哦)
- JAVA开发讲义(一)-Java的自白