diff --git a/src/main/java/com/example/mina/server/httpdemo/HttpServerDemo.java b/src/main/java/com/example/mina/server/httpdemo/HttpServerDemo.java new file mode 100644 index 0000000..6edf648 --- /dev/null +++ b/src/main/java/com/example/mina/server/httpdemo/HttpServerDemo.java @@ -0,0 +1,30 @@ +package com.example.mina.server.httpdemo; + +import lombok.extern.slf4j.Slf4j; +import org.apache.mina.core.service.IoAcceptor; +import org.apache.mina.http.HttpServerCodec; +import org.apache.mina.transport.socket.nio.NioSocketAcceptor; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import java.net.InetSocketAddress; + +/** + * @author 杜云山 + * @date 21/03/23 + */ +@Slf4j +@Component +public class HttpServerDemo implements ApplicationRunner { + + @Override + public void run(ApplicationArguments args) throws Exception { + IoAcceptor acceptor = new NioSocketAcceptor(); + acceptor.getFilterChain().addLast("codec", new HttpServerCodec()); + acceptor.setHandler(new HttpServerHandle()); + acceptor.bind(new InetSocketAddress(9099)); + log.info("httpDemo服务端已经启动,监听端口: 9099"); + } + +} diff --git a/src/main/java/com/example/mina/server/httpdemo/HttpServerHandle.java b/src/main/java/com/example/mina/server/httpdemo/HttpServerHandle.java new file mode 100644 index 0000000..6b6b45c --- /dev/null +++ b/src/main/java/com/example/mina/server/httpdemo/HttpServerHandle.java @@ -0,0 +1,62 @@ +package com.example.mina.server.httpdemo; + +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.service.IoHandlerAdapter; +import org.apache.mina.core.session.IoSession; +import org.apache.mina.http.api.*; + +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +/** + * @author 杜云山 + * @date 21/03/23 + */ +public class HttpServerHandle extends IoHandlerAdapter { + + @Override + public void exceptionCaught(IoSession session, Throwable cause) { + cause.printStackTrace(); + } + + @Override + public void messageReceived(IoSession session, Object message) throws Exception { + + if (message instanceof HttpRequest) { + + // 请求,解码器将请求转换成HttpRequest对象 + HttpRequest request = (HttpRequest) message; + + // 获取请求参数 + String name = request.getParameter("name"); + if (name == null) { + name = "World"; + } + name = URLDecoder.decode(name, "UTF-8"); + + // 响应HTML + String responseHtml = "Hello, " + name + ""; + byte[] responseBytes = responseHtml.getBytes(StandardCharsets.UTF_8); + int contentLength = responseBytes.length; + + // 构造HttpResponse对象,HttpResponse只包含响应的status line和header部分 + Map headers = new HashMap<>(8); + headers.put("Content-Type", "text/html; charset=utf-8"); + headers.put("Content-Length", Integer.toString(contentLength)); + HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SUCCESS_OK, headers); + + // 响应BODY + IoBuffer responseIoBuffer = IoBuffer.allocate(contentLength); + responseIoBuffer.put(responseBytes); + responseIoBuffer.flip(); + + // 响应的status line和header部分 + session.write(response); + // 响应body部分 + session.write(responseIoBuffer); + } + } + +} -- libgit2 0.21.2