From 6317d877a75860a93155413a7349add3a65e6736 Mon Sep 17 00:00:00 2001
From: "zhang.hang" <2740277548@qq.com>
Date: Tue, 22 Oct 2019 19:34:49 +0800
Subject: [PATCH 1/3] =?UTF-8?q?SpringBoot=E6=95=B4=E5=90=88mail?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Springboot-Mail/README.MD | 8 ++
Springboot-Mail/pom.xml | 56 ++++++++++
Springboot-Mail/pusa.png | Bin 0 -> 16323 bytes
.../boot/mail/SpringBootMailApplication.java | 11 ++
.../boot/mail/controller/MailController.java | 83 +++++++++++++++
.../com/button/boot/mail/model/MailModel.java | 60 +++++++++++
.../button/boot/mail/service/MailService.java | 10 ++
.../mail/service/impl/MailServiceImpl.java | 97 ++++++++++++++++++
.../src/main/resources/application.yml | 29 ++++++
.../src/main/resources/logback.xml | 30 ++++++
.../main/resources/templates/resource.html | 11 ++
11 files changed, 395 insertions(+)
create mode 100644 Springboot-Mail/README.MD
create mode 100644 Springboot-Mail/pom.xml
create mode 100644 Springboot-Mail/pusa.png
create mode 100644 Springboot-Mail/src/main/java/com/button/boot/mail/SpringBootMailApplication.java
create mode 100644 Springboot-Mail/src/main/java/com/button/boot/mail/controller/MailController.java
create mode 100644 Springboot-Mail/src/main/java/com/button/boot/mail/model/MailModel.java
create mode 100644 Springboot-Mail/src/main/java/com/button/boot/mail/service/MailService.java
create mode 100644 Springboot-Mail/src/main/java/com/button/boot/mail/service/impl/MailServiceImpl.java
create mode 100644 Springboot-Mail/src/main/resources/application.yml
create mode 100644 Springboot-Mail/src/main/resources/logback.xml
create mode 100644 Springboot-Mail/src/main/resources/templates/resource.html
diff --git a/Springboot-Mail/README.MD b/Springboot-Mail/README.MD
new file mode 100644
index 0000000..707bc09
--- /dev/null
+++ b/Springboot-Mail/README.MD
@@ -0,0 +1,8 @@
+# 本案例实现Springboot整合mail实现邮件发送
+注:application.yml中的邮箱授权码不是登录邮箱的地址,需要登录邮箱后自行设置
+测试发送普通邮件:http://localhost:8080/mail/sendSimpleMail
+测试发送html格式的邮件:http://localhost:8080/mail/sendHTMLMail
+测试发送带有附件的邮件:http://localhost:8080/mail/sendAttachmentMail
+测试镶嵌静态资源的邮件:http://localhost:8080/mail/sendInlineResourceMail
+
+
diff --git a/Springboot-Mail/pom.xml b/Springboot-Mail/pom.xml
new file mode 100644
index 0000000..e8af75a
--- /dev/null
+++ b/Springboot-Mail/pom.xml
@@ -0,0 +1,56 @@
+
+ 4.0.0
+ com.button
+ Springboot-Mail
+ 0.0.1-SNAPSHOT
+ jar
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.1.RELEASE
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-mail
+
+
+ org.springframework.boot
+ spring-boot-starter-freemarker
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ -Dfile.encoding=UTF-8
+ true
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Springboot-Mail/pusa.png b/Springboot-Mail/pusa.png
new file mode 100644
index 0000000000000000000000000000000000000000..74c0c458772556c61b7a655ce431decc139b1409
GIT binary patch
literal 16323
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测试邮件发送(HTML格式)")
+ .append("这里是发送邮件的文本内容!
");
+ mailModel.setContent(sb.toString());
+ mailService.sendHTMLMail(mailModel);
+ } catch (Exception e) {
+ LOGGER.error("sendHTMLMail邮件发送出现异常. ex={}", e);
+ }
+ }
+
+ @GetMapping(value = "/sendAttachmentMail")
+ public void sendAttachmentMail() {
+ try {
+ MailModel mailModel = new MailModel();
+ mailModel.setFrom(MAIL_FROM);
+ mailModel.setTo(MAIL_TO);
+ mailModel.setSubject("sendAttachmentMail");
+ mailModel.setContent("这是一封带有附件的邮件!!");
+ mailModel.setResourcePath("pusa.png");
+ mailService.sendAttachmentMail(mailModel);
+ } catch (Exception e) {
+ LOGGER.error("sendAttachmentMail邮件发送出现异常. ex={}", e);
+ }
+ }
+
+ @GetMapping(value = "/sendInlineResourceMail")
+ public void sendInlineResourceMail() {
+ try {
+ MailModel mailModel = new MailModel();
+ mailModel.setFrom(MAIL_FROM);
+ String[] mailTo = {MAIL_TO, MAIL_TO2};
+ mailModel.setTo(mailTo);
+ mailModel.setSubject("sendInlineResourceMail");
+ mailModel.setContent("这是一封镶嵌静态资源的邮件!!");
+ mailModel.setResourcePath("src/main/resources/templates/resource.html");
+ mailModel.setResourceId("静态资源");
+ mailService.sendInlineResourceMail(mailModel);
+ } catch (Exception e) {
+ LOGGER.error("sendAttachmentMail邮件发送出现异常. ex={}", e);
+ }
+ }
+}
diff --git a/Springboot-Mail/src/main/java/com/button/boot/mail/model/MailModel.java b/Springboot-Mail/src/main/java/com/button/boot/mail/model/MailModel.java
new file mode 100644
index 0000000..eb933c2
--- /dev/null
+++ b/Springboot-Mail/src/main/java/com/button/boot/mail/model/MailModel.java
@@ -0,0 +1,60 @@
+package com.button.boot.mail.model;
+
+import java.io.Serializable;
+import java.util.Arrays;
+
+public class MailModel implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private String from;
+ private String[] to;
+ private String subject;
+ private String content;
+ private String resourcePath; //附件路径,资源等的路径
+ private String resourceId; //
+
+ public String getFrom() {
+ return from;
+ }
+ public void setFrom(String from) {
+ this.from = from;
+ }
+ public String[] getTo() {
+ return this.to;
+ }
+ public void setTo(String to) {
+ this.to = new String[] {to};
+ }
+ public void setTo(String... to) {
+ this.to = to;
+ }
+ public String getSubject() {
+ return subject;
+ }
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+ public String getContent() {
+ return content;
+ }
+ public void setContent(String content) {
+ this.content = content;
+ }
+ public String getResourcePath() {
+ return resourcePath;
+ }
+ public void setResourcePath(String resourcePath) {
+ this.resourcePath = resourcePath;
+ }
+ public String getResourceId() {
+ return resourceId;
+ }
+ public void setResourceId(String resourceId) {
+ this.resourceId = resourceId;
+ }
+ @Override
+ public String toString() {
+ return "MailModel [from=" + from + ", to=" + Arrays.toString(to) + ", subject=" + subject + ", content="
+ + content + ", resourcePath=" + resourcePath + ", resourceId=" + resourceId + "]";
+ }
+}
diff --git a/Springboot-Mail/src/main/java/com/button/boot/mail/service/MailService.java b/Springboot-Mail/src/main/java/com/button/boot/mail/service/MailService.java
new file mode 100644
index 0000000..1892a44
--- /dev/null
+++ b/Springboot-Mail/src/main/java/com/button/boot/mail/service/MailService.java
@@ -0,0 +1,10 @@
+package com.button.boot.mail.service;
+
+import com.button.boot.mail.model.MailModel;
+
+public interface MailService {
+ void sendSimpleMail(MailModel mailModel);
+ void sendHTMLMail(MailModel mailModel);
+ void sendAttachmentMail(MailModel mailModel);
+ void sendInlineResourceMail(MailModel mailModel);
+}
diff --git a/Springboot-Mail/src/main/java/com/button/boot/mail/service/impl/MailServiceImpl.java b/Springboot-Mail/src/main/java/com/button/boot/mail/service/impl/MailServiceImpl.java
new file mode 100644
index 0000000..ba62cbb
--- /dev/null
+++ b/Springboot-Mail/src/main/java/com/button/boot/mail/service/impl/MailServiceImpl.java
@@ -0,0 +1,97 @@
+package com.button.boot.mail.service.impl;
+
+import java.io.File;
+
+import javax.mail.internet.MimeMessage;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.MimeMessageHelper;
+import org.springframework.stereotype.Service;
+
+import com.button.boot.mail.model.MailModel;
+import com.button.boot.mail.service.MailService;
+
+@Service
+public class MailServiceImpl implements MailService {
+ private static final Logger LOGGER = LoggerFactory.getLogger(MailServiceImpl.class);
+
+ @Autowired
+ private JavaMailSender javaMailSender;
+
+ @Override
+ public void sendSimpleMail(MailModel mailModel) {
+ SimpleMailMessage message = new SimpleMailMessage();
+ message.setFrom(mailModel.getFrom());
+ message.setTo(mailModel.getTo());
+ message.setSubject(mailModel.getSubject());
+ message.setText(mailModel.getContent());
+ try {
+ javaMailSender.send(message);
+ } catch (Exception e) {
+ LOGGER.error("sendSimpleMail发送邮件时发生异常. ex={}", e);
+ }
+ }
+
+ @Override
+ public void sendHTMLMail(MailModel mailModel) {
+ MimeMessage message = javaMailSender.createMimeMessage();
+ try {
+ MimeMessageHelper helper = new MimeMessageHelper(message, true);
+ helper.setFrom(mailModel.getFrom());
+ helper.setTo(mailModel.getTo());
+ helper.setSubject(mailModel.getSubject());
+ helper.setText(mailModel.getContent(), true);
+
+ javaMailSender.send(message);
+ LOGGER.info("html邮件发送成功");
+ } catch (Exception e) {
+ LOGGER.error("sendHTMLMail发送邮件时发生异. ex={}", e);
+ }
+ }
+
+ @Override
+ public void sendAttachmentMail(MailModel mailModel) {
+ MimeMessage mimeMailMessage = null;
+ try {
+ mimeMailMessage = javaMailSender.createMimeMessage();
+ MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
+ mimeMessageHelper.setFrom(mailModel.getFrom());
+ mimeMessageHelper.setTo(mailModel.getTo());
+ mimeMessageHelper.setSubject(mailModel.getSubject());
+ mimeMessageHelper.setText(mailModel.getContent());
+ //文件路径
+ FileSystemResource resource = new FileSystemResource(new File(mailModel.getResourcePath()));
+ String fileName = new File(mailModel.getResourcePath()).getName();
+ mimeMessageHelper.addAttachment(fileName, resource);
+
+ javaMailSender.send(mimeMailMessage);
+ } catch (Exception e) {
+ LOGGER.error("sendAttachmentMail发送邮件时出现异常. ex={}", e);
+ }
+ }
+
+ @Override
+ public void sendInlineResourceMail(MailModel mailModel){
+ MimeMessage message = javaMailSender.createMimeMessage();
+
+ try {
+ MimeMessageHelper helper = new MimeMessageHelper(message, true);
+ helper.setFrom(mailModel.getFrom());
+ helper.setTo(mailModel.getTo());
+ helper.setSubject(mailModel.getSubject());
+ helper.setText(mailModel.getContent(), true);
+
+ FileSystemResource res = new FileSystemResource(new File(mailModel.getResourcePath()));
+ helper.addInline(mailModel.getResourceId(), res);
+
+ javaMailSender.send(message);
+ } catch (Exception e) {
+ LOGGER.error("sendInlineResourceMail发送邮件时出现异常. ex={}", e);
+ }
+ }
+}
diff --git a/Springboot-Mail/src/main/resources/application.yml b/Springboot-Mail/src/main/resources/application.yml
new file mode 100644
index 0000000..8c5f0de
--- /dev/null
+++ b/Springboot-Mail/src/main/resources/application.yml
@@ -0,0 +1,29 @@
+server:
+ servlet:
+ context-path: /mail
+ port: 8080
+ uri-encoding: utf-8
+
+logging:
+ file: logback.xml
+
+spring:
+ mail:
+ host: smtp.163.com
+ username: **********@163.com #邮箱地址
+ password: ********* #邮箱授权码
+ default-encoding: UTF-8
+ properties:
+ mail:
+ smtp:
+ auth: true
+ smtp:
+ starttls:
+ enable: true
+ required: true
+ freemarker:
+ content-type: text/html
+ suffix: .ftl
+ template-loader-path: classpath:/templates
+ charset: UTF-8
+ check-template-location: true
diff --git a/Springboot-Mail/src/main/resources/logback.xml b/Springboot-Mail/src/main/resources/logback.xml
new file mode 100644
index 0000000..b7bf852
--- /dev/null
+++ b/Springboot-Mail/src/main/resources/logback.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+ ${LOG_HOME}/springboot_mail.log
+
+
+ ${LOG_HOME}/springboot_mail.log.%d{yyyy-MM-dd}.%i.log
+
+
+ 100MB
+
+ 10
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Springboot-Mail/src/main/resources/templates/resource.html b/Springboot-Mail/src/main/resources/templates/resource.html
new file mode 100644
index 0000000..48b2624
--- /dev/null
+++ b/Springboot-Mail/src/main/resources/templates/resource.html
@@ -0,0 +1,11 @@
+
+
+
+
+ mail
+
+
+您好,这是验证邮件,请点击下面的链接完成验证,
+激活账号
+
+
--
Gitee
From 00bb6c819ead8a0c0a09b04500911b67bc3e5a0e Mon Sep 17 00:00:00 2001
From: "zhang.hang" <2740277548@qq.com>
Date: Tue, 22 Oct 2019 19:48:12 +0800
Subject: [PATCH 2/3] =?UTF-8?q?SpringBoot=E6=95=B4=E5=90=88Netty?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Springboot-Netty-Parent/README.MD | 1 +
.../Springboot-Netty-Client/README.MD | 1 +
.../Springboot-Netty-Client/pom.xml | 32 ++++++++++++
.../SpringbootNettyClientApplication.java | 16 ++++++
.../client/netty/NettyClientApplication.java | 42 ++++++++++++++++
.../channel/HelloWorldChannelInitializer.java | 18 +++++++
.../netty/handler/HelloWorldHandler.java | 27 ++++++++++
.../src/main/resources/application.yml | 9 ++++
.../src/main/resources/logback.xml | 34 +++++++++++++
.../Springboot-Netty-Server/README.MD | 1 +
.../Springboot-Netty-Server/pom.xml | 31 ++++++++++++
.../SpringbootNettyServerApplication.java | 18 +++++++
.../server/netty/NettyServerApplication.java | 50 +++++++++++++++++++
.../channel/HelloWorldChannelInitializer.java | 19 +++++++
.../netty/handler/HelloWorldHandler.java | 37 ++++++++++++++
.../src/main/resources/application.yml | 9 ++++
.../src/main/resources/logback.xml | 34 +++++++++++++
Springboot-Netty-Parent/pom.xml | 45 +++++++++++++++++
18 files changed, 424 insertions(+)
create mode 100644 Springboot-Netty-Parent/README.MD
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Client/README.MD
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Client/pom.xml
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/SpringbootNettyClientApplication.java
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/netty/NettyClientApplication.java
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/netty/channel/HelloWorldChannelInitializer.java
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/netty/handler/HelloWorldHandler.java
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Client/src/main/resources/application.yml
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Client/src/main/resources/logback.xml
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Server/README.MD
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Server/pom.xml
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/SpringbootNettyServerApplication.java
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/netty/NettyServerApplication.java
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/netty/channel/HelloWorldChannelInitializer.java
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/netty/handler/HelloWorldHandler.java
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Server/src/main/resources/application.yml
create mode 100644 Springboot-Netty-Parent/Springboot-Netty-Server/src/main/resources/logback.xml
create mode 100644 Springboot-Netty-Parent/pom.xml
diff --git a/Springboot-Netty-Parent/README.MD b/Springboot-Netty-Parent/README.MD
new file mode 100644
index 0000000..771a215
--- /dev/null
+++ b/Springboot-Netty-Parent/README.MD
@@ -0,0 +1 @@
+# 本案例实现Springboot整合Netty
\ No newline at end of file
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Client/README.MD b/Springboot-Netty-Parent/Springboot-Netty-Client/README.MD
new file mode 100644
index 0000000..6a0a9e1
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Client/README.MD
@@ -0,0 +1 @@
+# netty客户端
\ No newline at end of file
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Client/pom.xml b/Springboot-Netty-Parent/Springboot-Netty-Client/pom.xml
new file mode 100644
index 0000000..8df7ddb
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Client/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+
+ com.button
+ Springboot-Netty-Parent
+ 0.0.1-SNAPSHOT
+
+ Springboot-Netty-Client
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+ true
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ -Dfile.encoding=UTF-8
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/SpringbootNettyClientApplication.java b/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/SpringbootNettyClientApplication.java
new file mode 100644
index 0000000..1d27ec4
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/SpringbootNettyClientApplication.java
@@ -0,0 +1,16 @@
+package com.button.boot.netty.client;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import com.button.boot.netty.client.netty.NettyClientApplication;
+
+@SpringBootApplication
+public class SpringbootNettyClientApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringbootNettyClientApplication.class, args);
+ //启动netty客户端
+ NettyClientApplication nettyClient = new NettyClientApplication();
+ nettyClient.start();
+ }
+}
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/netty/NettyClientApplication.java b/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/netty/NettyClientApplication.java
new file mode 100644
index 0000000..ce3c771
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/netty/NettyClientApplication.java
@@ -0,0 +1,42 @@
+package com.button.boot.netty.client.netty;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import com.button.boot.netty.client.netty.channel.HelloWorldChannelInitializer;
+
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+
+@Component
+public class NettyClientApplication {
+ private static final Logger LOGGER = LoggerFactory.getLogger(NettyClientApplication.class);
+
+ public void start() {
+ EventLoopGroup group = new NioEventLoopGroup();
+ Bootstrap bootstrap = new Bootstrap()
+ .group(group)
+ // 该参数的作用就是禁止使用Nagle算法,使用于小数据即时传输
+ .option(ChannelOption.TCP_NODELAY, true)
+ .channel(NioSocketChannel.class)
+ .handler(new HelloWorldChannelInitializer());
+
+ try {
+ ChannelFuture future = bootstrap.connect("127.0.0.1", 8088).sync();
+ LOGGER.info("客户端成功....");
+ // 发送消息
+ future.channel().writeAndFlush("你好啊");
+ // 等待连接被关闭
+ future.channel().closeFuture().sync();
+ } catch (Exception e) {
+ LOGGER.error("初始化客户端时出现异常. ex={}", e);
+ } finally {
+ group.shutdownGracefully();
+ }
+ }
+}
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/netty/channel/HelloWorldChannelInitializer.java b/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/netty/channel/HelloWorldChannelInitializer.java
new file mode 100644
index 0000000..7dc2a4d
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/netty/channel/HelloWorldChannelInitializer.java
@@ -0,0 +1,18 @@
+package com.button.boot.netty.client.netty.channel;
+
+import com.button.boot.netty.client.netty.handler.HelloWorldHandler;
+
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.handler.codec.string.StringDecoder;
+import io.netty.handler.codec.string.StringEncoder;
+
+public class HelloWorldChannelInitializer extends ChannelInitializer {
+
+ @Override
+ protected void initChannel(SocketChannel socketChannel) throws Exception {
+ socketChannel.pipeline().addLast("decoder", new StringDecoder());
+ socketChannel.pipeline().addLast("encoder", new StringEncoder());
+ socketChannel.pipeline().addLast(new HelloWorldHandler());
+ }
+}
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/netty/handler/HelloWorldHandler.java b/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/netty/handler/HelloWorldHandler.java
new file mode 100644
index 0000000..3c69ecf
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/java/com/button/boot/netty/client/netty/handler/HelloWorldHandler.java
@@ -0,0 +1,27 @@
+package com.button.boot.netty.client.netty.handler;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+
+public class HelloWorldHandler extends ChannelInboundHandlerAdapter {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(HelloWorldHandler.class);
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ LOGGER.info("客户端Active .....");
+ }
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ LOGGER.info("客户端收到消息: {}", msg.toString());
+ }
+
+ @Override
+ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
+ cause.printStackTrace();
+ ctx.close();
+ }
+}
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/resources/application.yml b/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/resources/application.yml
new file mode 100644
index 0000000..b255b6b
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/resources/application.yml
@@ -0,0 +1,9 @@
+server:
+ servlet:
+ context-path: /nClient
+ port: 8081
+ uri-encoding: utf-8
+
+logging:
+ file: logback.xml
+
\ No newline at end of file
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/resources/logback.xml b/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/resources/logback.xml
new file mode 100644
index 0000000..53285fd
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Client/src/main/resources/logback.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+ ${LOG_HOME}/springboot_netty_client.log
+
+
+ ${LOG_HOME}/springboot_netty_client.log.%d{yyyy-MM-dd}.%i.log
+
+
+ 100MB
+
+
+ 10
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Server/README.MD b/Springboot-Netty-Parent/Springboot-Netty-Server/README.MD
new file mode 100644
index 0000000..71b7093
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Server/README.MD
@@ -0,0 +1 @@
+# netty服务端
\ No newline at end of file
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Server/pom.xml b/Springboot-Netty-Parent/Springboot-Netty-Server/pom.xml
new file mode 100644
index 0000000..6bd75e0
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Server/pom.xml
@@ -0,0 +1,31 @@
+
+ 4.0.0
+
+ com.button
+ Springboot-Netty-Parent
+ 0.0.1-SNAPSHOT
+
+ Springboot-Netty-Server
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+ true
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ -Dfile.encoding=UTF-8
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/SpringbootNettyServerApplication.java b/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/SpringbootNettyServerApplication.java
new file mode 100644
index 0000000..d2723b8
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/SpringbootNettyServerApplication.java
@@ -0,0 +1,18 @@
+package com.button.boot.netty.server;
+
+import java.net.InetSocketAddress;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import com.button.boot.netty.server.netty.NettyServerApplication;
+
+@SpringBootApplication
+public class SpringbootNettyServerApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringbootNettyServerApplication.class, args);
+ //启动服务端
+ NettyServerApplication nettyServer = new NettyServerApplication();
+ nettyServer.start(new InetSocketAddress("127.0.0.1", 8088));
+ }
+}
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/netty/NettyServerApplication.java b/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/netty/NettyServerApplication.java
new file mode 100644
index 0000000..c397c9a
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/netty/NettyServerApplication.java
@@ -0,0 +1,50 @@
+package com.button.boot.netty.server.netty;
+
+import java.net.InetSocketAddress;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import com.button.boot.netty.server.netty.channel.HelloWorldChannelInitializer;
+
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+
+@Component
+public class NettyServerApplication {
+ private static final Logger LOGGER = LoggerFactory.getLogger(NettyServerApplication.class);
+
+ public void start(InetSocketAddress socketAddress) {
+ //new 一个主线程组
+ EventLoopGroup bossGroup = new NioEventLoopGroup(1);
+ //new 一个工作线程组
+ EventLoopGroup workGroup = new NioEventLoopGroup(200);
+ ServerBootstrap bootstrap = new ServerBootstrap()
+ .group(bossGroup, workGroup)
+ .channel(NioServerSocketChannel.class)
+ .childHandler(new HelloWorldChannelInitializer())
+ .localAddress(socketAddress)
+ //设置队列大小
+ .option(ChannelOption.SO_BACKLOG, 1024)
+ // 两小时内没有数据的通信时,TCP会自动发送一个活动探测数据报文
+ .childOption(ChannelOption.SO_KEEPALIVE, true);
+ //绑定端口,开始接收进来的连接
+ try {
+ ChannelFuture future = bootstrap.bind(socketAddress).sync();
+ LOGGER.info("服务器启动开始监听端口: {}", socketAddress.getPort());
+ future.channel().closeFuture().sync();
+ } catch (Exception e) {
+ LOGGER.error("初始化netty服务端时出现异常. ex={}", e);
+ } finally {
+ //关闭主线程组
+ bossGroup.shutdownGracefully();
+ //关闭工作线程组
+ workGroup.shutdownGracefully();
+ }
+ }
+}
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/netty/channel/HelloWorldChannelInitializer.java b/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/netty/channel/HelloWorldChannelInitializer.java
new file mode 100644
index 0000000..cd2e0df
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/netty/channel/HelloWorldChannelInitializer.java
@@ -0,0 +1,19 @@
+package com.button.boot.netty.server.netty.channel;
+
+import com.button.boot.netty.server.netty.handler.HelloWorldHandler;
+
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.handler.codec.string.StringDecoder;
+import io.netty.handler.codec.string.StringEncoder;
+import io.netty.util.CharsetUtil;
+
+public class HelloWorldChannelInitializer extends ChannelInitializer {
+ @Override
+ protected void initChannel(SocketChannel socketChannel) throws Exception {
+ //添加编解码
+ socketChannel.pipeline().addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
+ socketChannel.pipeline().addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));
+ socketChannel.pipeline().addLast(new HelloWorldHandler());
+ }
+}
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/netty/handler/HelloWorldHandler.java b/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/netty/handler/HelloWorldHandler.java
new file mode 100644
index 0000000..9dce6fd
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/java/com/button/boot/netty/server/netty/handler/HelloWorldHandler.java
@@ -0,0 +1,37 @@
+package com.button.boot.netty.server.netty.handler;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+
+public class HelloWorldHandler extends ChannelInboundHandlerAdapter {
+ private static final Logger LOGGER = LoggerFactory.getLogger(HelloWorldHandler.class);
+ /**
+ * 客户端连接会触发
+ */
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ LOGGER.info("Channel active......");
+ }
+
+ /**
+ * 客户端发消息会触发
+ */
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ LOGGER.info("服务器收到消息: {}", msg.toString());
+ ctx.write("你也好哦");
+ ctx.flush();
+ }
+
+ /**
+ * 发生异常触发
+ */
+ @Override
+ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
+ cause.printStackTrace();
+ ctx.close();
+ }
+}
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/resources/application.yml b/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/resources/application.yml
new file mode 100644
index 0000000..8dd1dc2
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/resources/application.yml
@@ -0,0 +1,9 @@
+server:
+ servlet:
+ context-path: /nServer
+ port: 8080
+ uri-encoding: utf-8
+
+logging:
+ file: logback.xml
+
\ No newline at end of file
diff --git a/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/resources/logback.xml b/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/resources/logback.xml
new file mode 100644
index 0000000..8bcf8eb
--- /dev/null
+++ b/Springboot-Netty-Parent/Springboot-Netty-Server/src/main/resources/logback.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+ ${LOG_HOME}/springboot_netty_server.log
+
+
+ ${LOG_HOME}/springboot_netty_server.log.%d{yyyy-MM-dd}.%i.log
+
+
+ 100MB
+
+
+ 10
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Springboot-Netty-Parent/pom.xml b/Springboot-Netty-Parent/pom.xml
new file mode 100644
index 0000000..5033631
--- /dev/null
+++ b/Springboot-Netty-Parent/pom.xml
@@ -0,0 +1,45 @@
+
+ 4.0.0
+ com.button
+ Springboot-Netty-Parent
+ 0.0.1-SNAPSHOT
+ pom
+
+ Springboot-Netty-Server
+ Springboot-Netty-Client
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.1.RELEASE
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.projectlombok
+ lombok
+
+
+ io.netty
+ netty-all
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
\ No newline at end of file
--
Gitee
From 97bcd5c838433a12c92294cdfe49e4d31b1b2835 Mon Sep 17 00:00:00 2001
From: "zhang.hang" <2740277548@qq.com>
Date: Tue, 22 Oct 2019 19:49:50 +0800
Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index d0a8eb9..8ca7d33 100644
--- a/README.md
+++ b/README.md
@@ -22,4 +22,6 @@ SpringBoot应用集合
- [SpringBoot整合Httpclient](https://gitee.com/superbutton/SpringBoot-Components/tree/develop/Springboot-Httpclient)
- [SpringBoot-Admin实现监控](https://gitee.com/superbutton/SpringBoot-Components/tree/develop/SpringBoot-Admin-Parent)
- [SpringBoot不同环境打包配置](https://gitee.com/superbutton/SpringBoot-Components/tree/develop/Springboot-Springsession)
-- [SpringBoot利用springsession实现session共享](https://gitee.com/superbutton/SpringBoot-Components/tree/develop/Springboot-Springsession)
\ No newline at end of file
+- [SpringBoot利用springsession实现session共享](https://gitee.com/superbutton/SpringBoot-Components/tree/develop/Springboot-Springsession)
+- [SpringBoot整合mail](https://gitee.com/superbutton/SpringBoot-Components/tree/develop/Springboot-Mail)
+- [SpringBoot整合netty](https://gitee.com/superbutton/SpringBoot-Components/tree/develop/Springboot-Netty-Parent)
\ No newline at end of file
--
Gitee