zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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());