个人博客原文地址:http://www.ltang.me/2015/12/01/httpserver_spring/
项目中原本使用的是基于socket的server,后来因为一些原因,需要添加一个http的回调地址,供外部调用,但是总不能修改项目结构,而且只是一个接口需求,不想也不需要重新开个项目丢进服务器,所以直接使用了java自带的HttpServer类,启动一个端口作为http请求的回调地址。
-
HttpServer代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
public void start() { try { server = HttpServer.create(new InetSocketAddress(port), 0); server.createContext("/backcall", backCallHandler); server.setExecutor(null); server.start(); logger.info("本地监听端口启动成功({})", port); } catch (IOException e) { logger.error("本地监听端口启动失败(" + port + ")", e); } } public void stop() { if (server != null) { server.stop(100); } }
-
其中backCallHandler是对http请求的分发类,解析请求参数,再调用其它方法处理请求并返回结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
public class BackCallHandler implements HttpHandler, ApplicationContextAware { public void handle(HttpExchange httpExchange) throws IOException { InputStream in = httpExchange.getRequestBody(); //获得输入流 BufferedReader reader = new BufferedReader(new InputStreamReader(in, weiZhiUtil.ENCODING)); String parameterStr = ""; String temp = null; while ((temp = reader.readLine()) != null) { parameterStr += temp; } Map<String, String> parameters = null; try { parameters = getParametersMap(parameterStr); } catch (Exception e) { } LOGGER.info("回调接口收到请求,参数为:[" + parameterStr + "]"); ...... httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, resDoc.asXML().getBytes("UTF-8").length); OutputStream out = httpExchange.getResponseBody(); out.write(resDoc.asXML().getBytes("UTF-8"); out.flush(); ......
-
使用spring bean配置并管理httpServer的启动:
1 2 3
<bean class="com.kuaisu.weizhi.service.WeiZhiHttpServer" init-method="start" destroy-method="stop"> <property name="port" value="${HTTP_LOCAL_PORT}"/> </bean>
spring在实例化这个对象时,就会调用
start
方法初始化,并注入port参数,启动httpServer。