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 @@ | @@ -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 @@ | @@ -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 | +} |