/** * <pre> * AjaxResult.java * @author kanpiaoxue<br> * @version 1.0 * Create Time 2014年12月4日 下午6:01:05<br> * Description : ajax请求结果 * </pre> */ public class AjaxResult { private int code; private String message; private Object body; public static AjaxResult SUCCESS = new AjaxResult(0, "success"); public static AjaxResult FAILURE = new AjaxResult(1, "failure"); /** * <pre> * @param code * @param message * </pre> */ private AjaxResult(int code, String message) { super(); this.code = code; this.message = message; } /** * <pre> * @return the body * </pre> */ public Object getBody() { return body; } /** * <pre> * @return the code * </pre> */ public int getCode() { return code; } /** * <pre> * @return the message * </pre> */ public String getMessage() { return message; } /** * <pre> * @param body the body to set * </pre> */ public AjaxResult setBody(Object body) { this.body = body; return this; } /** * <pre> * @param code the code to set * </pre> */ public AjaxResult setCode(int code) { this.code = code; return this; } /** * <pre> * @param message the message to set * </pre> */ public AjaxResult setMessage(String message) { this.message = message; return this; } }
import static io.netty.handler.codec.http.HttpHeaders.Names.CONNECTION; import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_LENGTH; import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE; import static io.netty.handler.codec.http.HttpHeaders.Names.EXPIRES; import static io.netty.handler.codec.http.HttpResponseStatus.NOT_FOUND; import static io.netty.handler.codec.http.HttpResponseStatus.OK; import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSON; import com.google.common.base.Charsets; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.FullHttpResponse; import io.netty.handler.codec.http.HttpContent; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpHeaders.Values; import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http.QueryStringDecoder; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Pattern; /** * <pre> * HttpServerInboundHandler.java * @author kanpiaoxue<br> * @version 1.0 * Create Time 2014年12月4日 下午4:51:07<br> * Description : HttpServerInboundHandler * </pre> */ public class HttpServerInboundHandler extends ChannelInboundHandlerAdapter { private static final Logger LOGGER = LoggerFactory .getLogger(HttpServerInboundHandler.class); private static final Pattern SEND_TASK_FOR_METHOD_GET_PATTERN = Pattern .compile("/dmap-sf/query(?:\\?.*)?"); private static final Pattern SEND_TASK_FOR_METHOD_POST_PATTERN = Pattern .compile("/dmap-sf/sendMsg(?:\\?.*)?"); private HttpRequest request; private boolean isGet; private boolean isPost; /** * POST: http://localhost:8844/dmap-sf/sendMsg?hello=df&world=women body: we * are togather * * GET: http://localhost:8844/dmap-sf/query?hello=df&world=women */ @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof HttpRequest) { request = (HttpRequest) msg; String uri = request.getUri(); HttpMethod method = request.getMethod(); isGet = method.equals(HttpMethod.GET); isPost = method.equals(HttpMethod.POST); System.out.println(String.format("Uri:%s method %s", uri, method)); if (SEND_TASK_FOR_METHOD_GET_PATTERN.matcher(uri).matches() && isGet) { System.out.println("doing something here."); String param = "hello"; String str = getParamerByNameFromGET(param); System.out.println(param + ":" + str); } if (SEND_TASK_FOR_METHOD_POST_PATTERN.matcher(uri).matches() && isPost) { System.out.println("doing something here."); } else { String responseString = JSON.toJSONString(AjaxResult.FAILURE .setMessage(String.format( "Cann't find the url:%s for method:%s", uri, method.name()))); writeHttpResponse(responseString, ctx, NOT_FOUND); return; } } if (!isGet) { if (msg instanceof HttpContent) { HttpContent content = (HttpContent) msg; ByteBuf buf = content.content(); String bodyString = buf.toString(Charsets.UTF_8); System.out.println("body: " + bodyString); String l = getParamerByNameFromPOST("hello", bodyString); System.out.println(l); buf.release(); String responseString = JSON.toJSONString(AjaxResult.SUCCESS); writeHttpResponse(responseString, ctx, OK); } } } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { LOGGER.error(cause.getMessage()); ctx.close(); } private String getParamerByNameFromGET(String name) { QueryStringDecoder decoderQuery = new QueryStringDecoder( request.getUri()); return getParameterByName(name, decoderQuery); } private String getParamerByNameFromPOST(String name, String body) { QueryStringDecoder decoderQuery = new QueryStringDecoder("some?" + body); return getParameterByName(name, decoderQuery); } /** * <pre> * @param name * @param decoderQuery * @return * </pre> */ private String getParameterByName(String name, QueryStringDecoder decoderQuery) { Map<String, List<String>> uriAttributes = decoderQuery.parameters(); for (Entry<String, List<String>> attr : uriAttributes.entrySet()) { String key = attr.getKey(); for (String attrVal : attr.getValue()) { if (key.equals(name)) { return attrVal; } } } return null; } private void writeHttpResponse(String responseString, ChannelHandlerContext ctx, HttpResponseStatus status) throws UnsupportedEncodingException { FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, status, Unpooled.wrappedBuffer(responseString .getBytes(Charsets.UTF_8))); response.headers().set(CONTENT_TYPE, "text/json"); response.headers().set(CONTENT_LENGTH, response.content().readableBytes()); response.headers().set(EXPIRES, 0); if (HttpHeaders.isKeepAlive(request)) { response.headers().set(CONNECTION, Values.KEEP_ALIVE); } ctx.write(response); ctx.flush(); } }
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.http.HttpRequestDecoder; import io.netty.handler.codec.http.HttpResponseEncoder; /** * <pre> * HttpServer.java * @author kanpiaoxue<br> * @version 1.0 * Create Time 2014年12月4日 下午4:52:39<br> * Description : HttpServer * </pre> */ public class HttpServer { private static Log log = LogFactory.getLog(HttpServer.class); public void start(int port) throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new HttpResponseEncoder()); ch.pipeline().addLast(new HttpRequestDecoder()); ch.pipeline().addLast(new HttpServerInboundHandler()); } }).option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); ChannelFuture f = b.bind(port).sync(); f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { HttpServer server = new HttpServer(); log.info("Http Server listening on 8844 ..."); server.start(8844); } }