/** * <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); } }
相关推荐
在 "netty-http-server" 文件中,我们可以找到一个使用 Netty 实现的 HTTP 服务器示例,它展示了如何接收和处理 HTTP 请求。而在 "netty-http-client" 文件中,包含了一个简单的 HTTP 客户端示例,演示了如何向...
用 Netty 4 编写的 HTTP 服务器 任务 需要在netty框架( )上实现一个http服务器,功能如下: 根据对请求在 10 秒后发送“Hello World” 根据对请求,重定向到指定的 url 根据对请求统计信息: 请求总数 唯一...
Netty提供了WebSocket Server和WebSocket Client的实现,使得开发者可以方便地创建WebSocket服务端和客户端应用。WebSocket的优势在于它能够保持持久连接,允许服务器主动向客户端推送数据,非常适合实时通信场景。 ...
一个基于netty实现的servlet容器,可以很好的与springboot集成(jdk1.8 +) 作者邮箱: github地址: : 使用方法 1.添加依赖,在pom.xml中加入 <groupId>com.github.wangzihaogithub</groupId> <artifactId>...
"jar包直接当做web服务,netty负责http协议,配合springMVC",这样的架构模式就是一种创新的解决方案,它能够帮助我们构建高性能、低延迟的Web应用,尤其适合那些不依赖于JSP(JavaServer Pages)的纯Web服务项目。...
reactor-netty, TCP/HTTP/UDP 客户机/服务器,带有联网的反应器 反应器联网 http://projectreactor.io/docs/netty/release/api/在软件许可证 2.0许可,,,。
在这个"SocketIO-NettyClient&Server.zip"压缩包中,包含了一个使用Java和Netty实现的服务器端和客户端通信的示例。下面将详细解释相关知识点。 1. **Netty框架**: - Netty是一个开源的异步事件驱动的网络应用...
在`HttpFileServer`的`main`函数中,我们会设置Netty的服务器端配置,包括绑定监听的端口、创建EventLoopGroup(线程组)以及定义服务器的ChannelInitializer。EventLoopGroup是Netty用来管理线程的组件,它负责调度...
Netty的HttpServer模块可以构建高性能的HTTP/HTTPS服务器,支持HTTP/1.x和HTTP/2,可以用于搭建API服务、静态文件服务器或反向代理。 总的来说,Netty因其高度的可定制性、灵活性和性能优势,成为构建网络应用的...
4. **安全性与优化**: - 安全性:为了防止未授权访问,文件服务器应实施权限控制,只允许访问特定目录或文件。此外,考虑使用 SSL/TLS 提供加密通信,确保数据传输安全。 - 优化:对于大文件,可以使用分块传输...
【标题】"Spring+Mybatis+Netty3.6 HTTP服务器项目"是一个综合性的Web服务开发实例,结合了三个核心的开源技术框架:Spring、Mybatis和Netty3.6。这个项目旨在创建一个高性能、可扩展的HTTP服务器,能够处理GET和...
这样,当Netty接收到HTTP请求时,会将其交给RestEasy进行路由和处理,RestEasy会根据@Path注解找到对应的资源方法,并执行该方法。 在实际应用中,我们可以使用以下步骤实现这个过程: 1. 添加依赖:确保项目中...
为了实现SpringBoot与Netty的交互,我们还需要创建一个`WebFluxConfigurer`的实现类,重写`addtolisteners()`方法,将Netty的`HttpServer`实例注册为监听器。同时,通过`WebFluxConfig`可以定制Reactor Netty的相关...
ESA HttpServer是基于netty的异步事件驱动的http服务器。 特征 异步请求处理 Http1 / H2 / H2cUpgrade Https HAProxy Epoll / NIO 分块读/写 身体聚集 多部分 指标 更多功能... Maven依赖 < groupId>io....
"netty4server-master" 这个文件夹很可能是 Netty 服务器项目的源代码仓库,包含服务器端的配置、处理器等核心组件。通常,你可以在这里找到以下结构: - src/main/java:存放 Java 源代码,包括服务器的启动类、...
使用netty进行安卓端发送接收文字,并且附带发送图片功能,折腾了几天的netty总算有点眉目了,做下记录。 详细介绍:http://lison.cc/508.html github下载地址:https://github.com/LisonLiou/netty-learning.git
4.netty开发httpserver服务 - netty-httpserver 5.netty开发websocket服务 - netty-websocket 6.netty生产级心跳学习,利用IdleStateEvent模拟心跳、断线重连等 - netty-heartbeat 7.netty权威指南中的私有协议栈...
掩蔽休息项目简介:基于Netty实现Http Server框架,极简API发布Rest服务及Websocket服务(端口可替换)主要功能: Http服务器框架rest请求处理注册与分配(同一端口支持发布多个context-path服务),支持重定向,...
Netty has been designed carefully with the experiences earned from the implementation of a lot of protocols such as FTP, SMTP, HTTP, and various binary and text-based legacy protocols. As a result, ...
4. **配置WebSocketServerProtocolHandler**:Netty提供了`WebSocketServerProtocolHandler`,它是处理WebSocket升级请求的关键。你需要配置这个处理器,指定WebSocket的路径和其他参数。 5. **心跳机制**:...