From ea91e898bd8d00a0f080e2c3b67f931984a7fb7d Mon Sep 17 00:00:00 2001 From: pnoker Date: Tue, 30 Apr 2019 23:40:17 +0800 Subject: [PATCH] feat(driver): add rtmp transcoding service and netty tcp socket client/server implementation --- dc3-service/dc3-rtmp/.gitignore | 7 ++ dc3-service/dc3-rtmp/pom.xml | 32 +++++++ .../java/com/pnoker/rtsp/RtmpApplication.java | 38 +++++++++ .../com/pnoker/rtsp/bean/CommandTask.java | 13 +++ .../java/com/pnoker/rtsp/bean/Tasker.java | 32 +++++++ .../pnoker/rtsp/command/CommandBuilder.java | 53 ++++++++++++ .../com/pnoker/rtsp/handle/OutputHandle.java | 65 ++++++++++++++ .../src/main/resources/application-dev.yml | 18 ++++ .../main/resources/application-product.yml | 18 ++++ .../src/main/resources/application.yml | 5 ++ .../dc3-rtmp/src/main/resources/banner.txt | 9 ++ .../src/main/resources/static/favicon.ico | Bin 0 -> 947 bytes .../com/pnoker/socket/client/NettyClient.java | 79 ++++++++++++++++++ .../pnoker/socket/handler/ClientHandler.java | 19 +++++ .../pnoker/socket/handler/ServerHandler.java | 25 ++++++ .../com/pnoker/socket/server/NettyServer.java | 68 +++++++++++++++ .../server/ServerChannelInitializer.java | 25 ++++++ 17 files changed, 506 insertions(+) create mode 100644 dc3-service/dc3-rtmp/.gitignore create mode 100644 dc3-service/dc3-rtmp/pom.xml create mode 100644 dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/RtmpApplication.java create mode 100644 dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/CommandTask.java create mode 100644 dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/Tasker.java create mode 100644 dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/command/CommandBuilder.java create mode 100644 dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/handle/OutputHandle.java create mode 100644 dc3-service/dc3-rtmp/src/main/resources/application-dev.yml create mode 100644 dc3-service/dc3-rtmp/src/main/resources/application-product.yml create mode 100644 dc3-service/dc3-rtmp/src/main/resources/application.yml create mode 100644 dc3-service/dc3-rtmp/src/main/resources/banner.txt create mode 100644 dc3-service/dc3-rtmp/src/main/resources/static/favicon.ico create mode 100644 dc3-service/dc3-socket/src/main/java/com/pnoker/socket/client/NettyClient.java create mode 100644 dc3-service/dc3-socket/src/main/java/com/pnoker/socket/handler/ClientHandler.java create mode 100644 dc3-service/dc3-socket/src/main/java/com/pnoker/socket/handler/ServerHandler.java create mode 100644 dc3-service/dc3-socket/src/main/java/com/pnoker/socket/server/NettyServer.java create mode 100644 dc3-service/dc3-socket/src/main/java/com/pnoker/socket/server/ServerChannelInitializer.java diff --git a/dc3-service/dc3-rtmp/.gitignore b/dc3-service/dc3-rtmp/.gitignore new file mode 100644 index 000000000..15dbad4a3 --- /dev/null +++ b/dc3-service/dc3-rtmp/.gitignore @@ -0,0 +1,7 @@ +target/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr \ No newline at end of file diff --git a/dc3-service/dc3-rtmp/pom.xml b/dc3-service/dc3-rtmp/pom.xml new file mode 100644 index 000000000..f9bc22ebd --- /dev/null +++ b/dc3-service/dc3-rtmp/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + com.pnoker.rtmp + dc3-rtmp + jar + + iot-dc3 RTSP流转RTMP流 服务。 + + + com.pnoker.service + dc3-service + 3.0 + + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/RtmpApplication.java b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/RtmpApplication.java new file mode 100644 index 000000000..0678c50cf --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/RtmpApplication.java @@ -0,0 +1,38 @@ +/* + * Copyright 2018 Google LLC. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pnoker.rtsp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.scheduling.annotation.EnableAsync; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: + */ +@EnableAsync +@EnableFeignClients +@EnableEurekaClient +@SpringBootApplication +public class RtmpApplication { + public static void main(String[] args) { + SpringApplication.run(RtmpApplication.class, args); + } +} diff --git a/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/CommandTask.java b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/CommandTask.java new file mode 100644 index 000000000..208c053a4 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/CommandTask.java @@ -0,0 +1,13 @@ +package com.pnoker.rtsp.bean; + +import java.util.concurrent.LinkedBlockingQueue; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: 指令任务实体类,用于存放队列信息 + */ +public class CommandTask { + public static LinkedBlockingQueue taskQueue = new LinkedBlockingQueue(20); +} diff --git a/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/Tasker.java b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/Tasker.java new file mode 100644 index 000000000..6f2a65f8d --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/bean/Tasker.java @@ -0,0 +1,32 @@ +package com.pnoker.rtsp.bean; + +import com.pnoker.rtsp.handle.OutputHandle; +import lombok.Data; + +import java.io.IOException; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: 任务描述实体类 + */ +@Data +public class Tasker { + private String id; + private String command; + private Process process; + private OutputHandle outputHandle; + + public Tasker(String id, String command) { + this.id = id; + this.command = command; + } + + public void start() throws IOException { + Runtime runtime = Runtime.getRuntime(); + this.process = runtime.exec(this.command); + this.outputHandle = new OutputHandle(this.process); + new Thread(this.outputHandle).start(); + } +} diff --git a/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/command/CommandBuilder.java b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/command/CommandBuilder.java new file mode 100644 index 000000000..ae2067758 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/command/CommandBuilder.java @@ -0,0 +1,53 @@ +package com.pnoker.rtsp.command; + + +import lombok.Data; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: + */ +@Data +public class CommandBuilder { + private String cmd; + private StringBuilder stringBuilder; + + public CommandBuilder(String path) { + this.stringBuilder = new StringBuilder(path); + } + + public CommandBuilder create(String exe) { + if (null != stringBuilder) { + stringBuilder.append(exe); + } + return this; + } + + public CommandBuilder add(String cmd) { + if (null != stringBuilder) { + stringBuilder.append(" " + cmd); + } + return this; + } + + public CommandBuilder add(String key, String cmd) { + return add(key).add(cmd); + } + + public void build() { + cmd = stringBuilder.toString(); + } + + public static void main(String[] args) { + CommandBuilder builder = new CommandBuilder("D:/Documents/FFmpeg/bin/"); + builder.create("ffmpeg") + .add("-i", "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov") + .add("-vcodec", "copy") + .add("-acodec", "copy") + .add("-f", "flv") + .add("-y", "rtmp://106.14.182.20:1935/rtmp/tomcat").build(); + System.out.println(builder.getCmd()); + } +} diff --git a/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/handle/OutputHandle.java b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/handle/OutputHandle.java new file mode 100644 index 000000000..576e8f218 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/java/com/pnoker/rtsp/handle/OutputHandle.java @@ -0,0 +1,65 @@ +package com.pnoker.rtsp.handle; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: Process输出处理线程 + */ +@Slf4j +@Data +public class OutputHandle implements Runnable { + /** + * 运行状态,false:运行失败 + */ + private volatile boolean status = true; + private Process process; + + public OutputHandle(Process process) { + this.process = process; + } + + @Override + public void run() { + if (status) { + read(process.getErrorStream()); + } + } + + public void read(InputStream inputStream) { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line; + try { + if (!status) { + throw new IOException(); + } + while (null != (line = reader.readLine())) { + handle(line); + } + } catch (IOException e) { + log.error(e.getMessage(), e); + } finally { + try { + inputStream.close(); + process.destroyForcibly(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + } + + public void handle(String message) { + message = message.toLowerCase(); + if (message.contains("fail") || message.contains("miss")) { + this.status = false; + } + } +} diff --git a/dc3-service/dc3-rtmp/src/main/resources/application-dev.yml b/dc3-service/dc3-rtmp/src/main/resources/application-dev.yml new file mode 100644 index 000000000..2e08fd973 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/resources/application-dev.yml @@ -0,0 +1,18 @@ +server: + port: 8806 + undertow: + worker-threads: 20 + buffer-size: 512 + io-threads: 2 + +feign: + hystrix: + enabled: true + +logging: + file: dc3/logs/dc3-rtmp-dev.log + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8800/eureka/ diff --git a/dc3-service/dc3-rtmp/src/main/resources/application-product.yml b/dc3-service/dc3-rtmp/src/main/resources/application-product.yml new file mode 100644 index 000000000..ce7018ce3 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/resources/application-product.yml @@ -0,0 +1,18 @@ +server: + port: 8806 + undertow: + worker-threads: 20 + buffer-size: 512 + io-threads: 2 + +feign: + hystrix: + enabled: true + +logging: + file: dc3/logs/dc3-rtmp-product.log + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8800/eureka/,http://localhost:8801/eureka/ \ No newline at end of file diff --git a/dc3-service/dc3-rtmp/src/main/resources/application.yml b/dc3-service/dc3-rtmp/src/main/resources/application.yml new file mode 100644 index 000000000..7f17088a0 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/resources/application.yml @@ -0,0 +1,5 @@ +spring: + application: + name: dc3-service-rtsp-rtmp + profiles: + active: dev \ No newline at end of file diff --git a/dc3-service/dc3-rtmp/src/main/resources/banner.txt b/dc3-service/dc3-rtmp/src/main/resources/banner.txt new file mode 100644 index 000000000..6f7986792 --- /dev/null +++ b/dc3-service/dc3-rtmp/src/main/resources/banner.txt @@ -0,0 +1,9 @@ + +${AnsiColor.BRIGHT_CYAN}Spring Boot${spring-boot.formatted-version}${AnsiColor.BRIGHT_RED} + .___ ________ .__ __ .__ __ _____ + __| _/____ \_____ \ |__| _____/ |_ ______ | | _____ _/ |__/ ____\___________ _____ + / __ |/ ___\ _(__ < | |/ _ \ __\ \____ \| | \__ \\ __\ __\/ _ \_ __ \/ \ +/ /_/ \ \___ / \ | ( <_> ) | | |_> > |__/ __ \| | | | ( <_> ) | \/ Y Y \ +\____ |\___ >______ / |__|\____/|__| | __/|____(____ /__| |__| \____/|__| |__|_| / + \/ \/ \/ |__| \/ \/ +${AnsiColor.BRIGHT_CYAN}Copyright c 2018-2020 The ${AnsiColor.BRIGHT_YELLOW}Pnoker${AnsiColor.BRIGHT_CYAN} Authors diff --git a/dc3-service/dc3-rtmp/src/main/resources/static/favicon.ico b/dc3-service/dc3-rtmp/src/main/resources/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a3d4060b76939d4f296a5920cc0a2148b4281225 GIT binary patch literal 947 zcmV;k15EshP)*g8Jq^N^oc)2WEbe*rJgSqp;`!Ufwu7O zfY;dKmF^={fn&Th^YIa?3EV}bMVcH;W@8+{(yelc@|2R)=cX?l3r$2`2krz=C(W7T z!?E}VN(1CKRBG3=HxAJ0XDI7bH!XdO!zLDe2KqDAN|EtpoDOhOyAC=HV9TbPmd+UY z#bQXB9F0+RdM{DA0J=CiW;(8kL<`XY@D#L+bBzEsiq0wk_L7&kDfucYyJOk0BSSNgYWQ?6!|N$t?%{khC@0;t z%N%1xfHuklgmusZ(u&>c7+L=U;f?s^>Nm?6Y=rS55666CB>1LIBFfq*THNqX&%iZcjb~J_3H{rQc!a{tpXfb2ivT z^{d5~FfP(Y*vO5>YCw>jkKQisQ&f+Tp#MKmy@LcXeS?<|ryOq_{Oc=Y%j?Q)EAI5n z%gs16cd$=?;>bk2Pn3q&w)=6O2D5eYoIT1G}*4$JTqf?H4G{ACm?I6?og|I zKQ`0pVCxFh3eO8l?hCv=0sRs0-d$G4mjguo#*#YEAw9>Gh(M*TD5r9dDyne?234n6<${`mwr=}V! zNdM|39Cbj^m>N@c-gY0|(ptG_JQ`X#D@+Tcm<&e?jEqU?Qj)#g+49a=Wts6z(i8_6 zy%|$%B{_Dy*8Pq;XYZ^bE&l%@D0tNf9j|X8(#1=oNV;b&wK~A6;1lot4{+-l_zP$m V;4n9*ODq5Y002ovPDHLkV1k;5yAl8Z literal 0 HcmV?d00001 diff --git a/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/client/NettyClient.java b/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/client/NettyClient.java new file mode 100644 index 000000000..4493ac0ed --- /dev/null +++ b/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/client/NettyClient.java @@ -0,0 +1,79 @@ +package com.pnoker.socket.client; + +import com.pnoker.socket.handler.ClientHandler; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.AttributeKey; +import io.netty.util.CharsetUtil; +import lombok.extern.slf4j.Slf4j; + +import java.net.InetSocketAddress; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: + */ +@Slf4j +public class NettyClient { + + + private static Bootstrap b; + private static ChannelFuture f; + private static final EventLoopGroup workerGroup = new NioEventLoopGroup(); + + private static void init() { + try { + log.info("init..."); + b = new Bootstrap(); + b.group(workerGroup); + b.channel(NioSocketChannel.class); + b.option(ChannelOption.SO_KEEPALIVE, true); + b.handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { + // 解码编码 + socketChannel.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8)); + socketChannel.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8)); + + socketChannel.pipeline().addLast(new ClientHandler()); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static Object startAndWrite(InetSocketAddress address, Object send) throws InterruptedException { + init(); + f = b.connect(address).sync(); + // 传数据给服务端 + f.channel().writeAndFlush(send); + f.channel().closeFuture().sync(); + return f.channel().attr(AttributeKey.valueOf("Attribute_key")).get(); + } + + public static void main(String[] args) { + InetSocketAddress address = new InetSocketAddress("127.0.0.1", 7000); + String message = "hello"; + try { + Object result = NettyClient.startAndWrite(address, message); + log.info("....result:" + result); + } catch (Exception e) { + log.error(e.getMessage()); + } finally { + f.channel().close(); + workerGroup.shutdownGracefully(); + log.info("Closed client!"); + } + } +} \ No newline at end of file diff --git a/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/handler/ClientHandler.java b/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/handler/ClientHandler.java new file mode 100644 index 000000000..ad665d9b2 --- /dev/null +++ b/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/handler/ClientHandler.java @@ -0,0 +1,19 @@ +package com.pnoker.socket.handler; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.util.AttributeKey; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: + */ +public class ClientHandler extends SimpleChannelInboundHandler { + @Override + protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object msg) { + channelHandlerContext.channel().attr(AttributeKey.valueOf("Attribute_key")).set(msg); + channelHandlerContext.close(); + } +} \ No newline at end of file diff --git a/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/handler/ServerHandler.java b/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/handler/ServerHandler.java new file mode 100644 index 000000000..abe187db0 --- /dev/null +++ b/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/handler/ServerHandler.java @@ -0,0 +1,25 @@ +package com.pnoker.socket.handler; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: + */ +public class ServerHandler extends SimpleChannelInboundHandler { + + @Override + public void channelRead0(ChannelHandlerContext ctx, Object msg) { + System.out.println("server receive message :" + msg); + ctx.channel().writeAndFlush("yes server already accept your message" + msg); + ctx.close(); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) { + System.out.println("channelActive>>>>>>>>"); + } +} \ No newline at end of file diff --git a/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/server/NettyServer.java b/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/server/NettyServer.java new file mode 100644 index 000000000..0f5990fde --- /dev/null +++ b/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/server/NettyServer.java @@ -0,0 +1,68 @@ +package com.pnoker.socket.server; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.Channel; +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; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.net.InetSocketAddress; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: + */ +@Slf4j +@Component +public class NettyServer { + + private final EventLoopGroup bossGroup = new NioEventLoopGroup(); + private final EventLoopGroup workerGroup = new NioEventLoopGroup(); + + private Channel channel; + + /** + * 启动服务 + */ + public ChannelFuture run(InetSocketAddress address) { + + ChannelFuture f = null; + try { + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childHandler(new ServerChannelInitializer()) + .option(ChannelOption.SO_BACKLOG, 128) + .childOption(ChannelOption.SO_KEEPALIVE, true); + + f = b.bind(address).syncUninterruptibly(); + channel = f.channel(); + } catch (Exception e) { + log.error("Netty start error:", e); + } finally { + if (f != null && f.isSuccess()) { + log.info("Netty server listening " + address.getHostName() + " on port " + address.getPort() + " and ready for connections..."); + } else { + log.error("Netty server start up Error!"); + } + } + + return f; + } + + public void destroy() { + log.info("Shutdown Netty Server..."); + if (channel != null) { + channel.close(); + } + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + log.info("Shutdown Netty Server Success!"); + } +} diff --git a/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/server/ServerChannelInitializer.java b/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/server/ServerChannelInitializer.java new file mode 100644 index 000000000..8055a75b3 --- /dev/null +++ b/dc3-service/dc3-socket/src/main/java/com/pnoker/socket/server/ServerChannelInitializer.java @@ -0,0 +1,25 @@ +package com.pnoker.socket.server; + +import com.pnoker.socket.handler.ServerHandler; +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; + +/** + *

Copyright(c) 2018. Pnoker All Rights Reserved. + *

Author : Pnoker + *

Email : pnokers@gmail.com + *

Description: + */ +public class ServerChannelInitializer extends ChannelInitializer { + @Override + protected void initChannel(SocketChannel socketChannel) { + // 解码编码 + socketChannel.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8)); + socketChannel.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8)); + + socketChannel.pipeline().addLast(new ServerHandler()); + } +} \ No newline at end of file