Commit 0aeb756e447e64e17449ab603bd0229133ae23a0
1 parent
da313394
Exists in
develop
feat: 增加http服务端demo
Showing
2 changed files
with
92 additions
and
0 deletions
Show diff stats
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 | +} | ... | ... |