Commit 0aeb756e447e64e17449ab603bd0229133ae23a0

Authored by 杜云山
1 parent da313394
Exists in develop

feat: 增加http服务端demo

src/main/java/com/example/mina/server/httpdemo/HttpServerDemo.java 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +package com.example.mina.server.httpdemo;
  2 +
  3 +import lombok.extern.slf4j.Slf4j;
  4 +import org.apache.mina.core.service.IoAcceptor;
  5 +import org.apache.mina.http.HttpServerCodec;
  6 +import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
  7 +import org.springframework.boot.ApplicationArguments;
  8 +import org.springframework.boot.ApplicationRunner;
  9 +import org.springframework.stereotype.Component;
  10 +
  11 +import java.net.InetSocketAddress;
  12 +
  13 +/**
  14 + * @author 杜云山
  15 + * @date 21/03/23
  16 + */
  17 +@Slf4j
  18 +@Component
  19 +public class HttpServerDemo implements ApplicationRunner {
  20 +
  21 + @Override
  22 + public void run(ApplicationArguments args) throws Exception {
  23 + IoAcceptor acceptor = new NioSocketAcceptor();
  24 + acceptor.getFilterChain().addLast("codec", new HttpServerCodec());
  25 + acceptor.setHandler(new HttpServerHandle());
  26 + acceptor.bind(new InetSocketAddress(9099));
  27 + log.info("httpDemo服务端已经启动,监听端口: 9099");
  28 + }
  29 +
  30 +}
... ...
src/main/java/com/example/mina/server/httpdemo/HttpServerHandle.java 0 → 100644
... ... @@ -0,0 +1,62 @@
  1 +package com.example.mina.server.httpdemo;
  2 +
  3 +import org.apache.mina.core.buffer.IoBuffer;
  4 +import org.apache.mina.core.service.IoHandlerAdapter;
  5 +import org.apache.mina.core.session.IoSession;
  6 +import org.apache.mina.http.api.*;
  7 +
  8 +import java.net.URLDecoder;
  9 +import java.nio.charset.StandardCharsets;
  10 +import java.util.HashMap;
  11 +import java.util.Map;
  12 +
  13 +/**
  14 + * @author 杜云山
  15 + * @date 21/03/23
  16 + */
  17 +public class HttpServerHandle extends IoHandlerAdapter {
  18 +
  19 + @Override
  20 + public void exceptionCaught(IoSession session, Throwable cause) {
  21 + cause.printStackTrace();
  22 + }
  23 +
  24 + @Override
  25 + public void messageReceived(IoSession session, Object message) throws Exception {
  26 +
  27 + if (message instanceof HttpRequest) {
  28 +
  29 + // 请求,解码器将请求转换成HttpRequest对象
  30 + HttpRequest request = (HttpRequest) message;
  31 +
  32 + // 获取请求参数
  33 + String name = request.getParameter("name");
  34 + if (name == null) {
  35 + name = "World";
  36 + }
  37 + name = URLDecoder.decode(name, "UTF-8");
  38 +
  39 + // 响应HTML
  40 + String responseHtml = "<html><body>Hello, " + name + "</body></html>";
  41 + byte[] responseBytes = responseHtml.getBytes(StandardCharsets.UTF_8);
  42 + int contentLength = responseBytes.length;
  43 +
  44 + // 构造HttpResponse对象,HttpResponse只包含响应的status line和header部分
  45 + Map<String, String> headers = new HashMap<>(8);
  46 + headers.put("Content-Type", "text/html; charset=utf-8");
  47 + headers.put("Content-Length", Integer.toString(contentLength));
  48 + HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SUCCESS_OK, headers);
  49 +
  50 + // 响应BODY
  51 + IoBuffer responseIoBuffer = IoBuffer.allocate(contentLength);
  52 + responseIoBuffer.put(responseBytes);
  53 + responseIoBuffer.flip();
  54 +
  55 + // 响应的status line和header部分
  56 + session.write(response);
  57 + // 响应body部分
  58 + session.write(responseIoBuffer);
  59 + }
  60 + }
  61 +
  62 +}
... ...