From dc68e1de84450353c9716f076dbd5fcdf837b911 Mon Sep 17 00:00:00 2001 From: hsoh Date: Wed, 29 Jun 2022 17:27:04 +0900 Subject: [PATCH] =?UTF-8?q?echo=20=EC=9E=91=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../socket/EchoSocketServer.java | 73 +++++++++++++++++++ .../socket/EchoSocketServerHandler.java | 72 ++++++++++++++++++ .../socket/SocketServerManageController.java | 45 ++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 src/main/java/com/eactive/httpmockserver/socket/EchoSocketServer.java create mode 100644 src/main/java/com/eactive/httpmockserver/socket/EchoSocketServerHandler.java create mode 100644 src/main/java/com/eactive/httpmockserver/socket/SocketServerManageController.java diff --git a/src/main/java/com/eactive/httpmockserver/socket/EchoSocketServer.java b/src/main/java/com/eactive/httpmockserver/socket/EchoSocketServer.java new file mode 100644 index 0000000..169f121 --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/socket/EchoSocketServer.java @@ -0,0 +1,73 @@ +//package com.eactive.httpmockserver.socket; +// +//import java.nio.ByteOrder; +// +//import javax.annotation.PreDestroy; +// +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.stereotype.Component; +// +//import io.netty.bootstrap.ServerBootstrap; +//import io.netty.channel.Channel; +//import io.netty.channel.ChannelFuture; +//import io.netty.channel.ChannelInitializer; +//import io.netty.channel.ChannelOption; +//import io.netty.channel.ChannelPipeline; +//import io.netty.channel.EventLoopGroup; +//import io.netty.channel.nio.NioEventLoopGroup; +//import io.netty.channel.socket.SocketChannel; +//import io.netty.channel.socket.nio.NioServerSocketChannel; +//import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +//import io.netty.handler.codec.LengthFieldPrepender; +//import io.netty.handler.codec.string.StringDecoder; +//import io.netty.util.CharsetUtil; +// +//@Component +//public class EchoSocketServer { +// private final Logger logger = LoggerFactory.getLogger(this.getClass()); +// +// private Channel channel; +// +// public void start() { +// EventLoopGroup bossGroup = new NioEventLoopGroup(); +// EventLoopGroup workerGroup = new NioEventLoopGroup(); +// try { +// ServerBootstrap server = new ServerBootstrap(); +// // @formatter:off +// server.group(bossGroup, workerGroup) +// .channel(NioServerSocketChannel.class) +// .childHandler(new ChannelInitializer() { +// @Override +// protected void initChannel(SocketChannel ch) throws Exception { +// ChannelPipeline pipeline = ch.pipeline(); +// //pipeline.addLast(new LengthFieldBasedFrameDecoder (ByteOrder.LITTLE_ENDIAN,Integer.MAX_VALUE,0,8,0,8,true)); +// //pipeline.addLast(new LengthFieldPrepender(8)); +// //pipeline.addLast(new LengthFieldBasedFrameDecoder (Integer.MAX_VALUE,0,8,0,8)); +// //pipeline.addLast(new LengthFieldBasedFrameDecoder (Integer.MAX_VALUE,0,2,0,2)); +// //pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8)); +// pipeline.addLast(new EchoSocketServerHandler()); +// } +// }) +// .option(ChannelOption.SO_BACKLOG, 128) +// .childOption(ChannelOption.SO_KEEPALIVE, false); +// // @formatter:on +// +// ChannelFuture channelFuture = server.bind(28181).sync(); +// channel = channelFuture.channel().closeFuture().sync().channel(); +// } catch (Exception e) { +// logger.error(e.getMessage()); +// } finally { +// bossGroup.shutdownGracefully(); +// workerGroup.shutdownGracefully(); +// } +// } +// +// @PreDestroy +// public void stop() { +// if (channel != null) { +// channel.close(); +// channel.parent().closeFuture(); +// } +// } +//} diff --git a/src/main/java/com/eactive/httpmockserver/socket/EchoSocketServerHandler.java b/src/main/java/com/eactive/httpmockserver/socket/EchoSocketServerHandler.java new file mode 100644 index 0000000..4b895c7 --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/socket/EchoSocketServerHandler.java @@ -0,0 +1,72 @@ +//package com.eactive.httpmockserver.socket; +// +//import java.nio.charset.StandardCharsets; +// +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.stereotype.Component; +// +//import io.netty.buffer.ByteBuf; +//import io.netty.channel.ChannelHandler.Sharable; +//import io.netty.channel.ChannelHandlerContext; +//import io.netty.channel.ChannelInboundHandlerAdapter; +// +//@Component +//@Sharable +//public class EchoSocketServerHandler extends ChannelInboundHandlerAdapter { +// private final Logger logger = LoggerFactory.getLogger(this.getClass()); +// +// private int DATA_LENGTH = 2048; +// private ByteBuf buff; +// +// @Override +// public void handlerAdded(ChannelHandlerContext ctx) { +// logger.info("EchoSocketServer handlerAdded"); +// buff = ctx.alloc().buffer(DATA_LENGTH); +// } +// +// @Override +// public void channelActive(ChannelHandlerContext ctx) { +// logger.info("Remote Address: " + ctx.channel().remoteAddress().toString()); +// } +// +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) { +// logger.info("EchoSocketServer channelRead"); +//// ByteBuf buf = (ByteBuf) msg; +//// byte[] bytes = new byte[buf.readableBytes()]; +//// buf.readBytes(bytes); +//// String data = new String(bytes, StandardCharsets.UTF_8); +// +//// ByteBuf mBuf = (ByteBuf) msg; +//// buff.writeBytes(mBuf); // Ŭ¶óÀÌ¾ðÆ®¿¡¼­ º¸³»´Â µ¥ÀÌÅͰ¡ ÃàÀûµÊ +//// mBuf.release(); +//// +//// //final ChannelFuture f = ctx.writeAndFlush(buff); +//// +//// System.out.println("TcpServer: " + buff.toString()); +//// ctx.writeAndFlush(buff); +// +// String message = ((ByteBuf) msg).toString(); +// System.out.println("message=" + message); +// ctx.write(msg); +// } +// +// @Override +// public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { +// logger.info("EchoSocketServer channelReadComplete"); +// ctx.flush(); +// } +// +// @Override +// public void handlerRemoved(ChannelHandlerContext ctx) { +// logger.info("EchoSocketServer handlerRemoved"); +// buff = null; +// } +// +// @Override +// public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { +// ctx.close(); +// cause.printStackTrace(); +// } +//} \ No newline at end of file diff --git a/src/main/java/com/eactive/httpmockserver/socket/SocketServerManageController.java b/src/main/java/com/eactive/httpmockserver/socket/SocketServerManageController.java new file mode 100644 index 0000000..0a2a7be --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/socket/SocketServerManageController.java @@ -0,0 +1,45 @@ +//package com.eactive.httpmockserver.socket; +// +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Controller; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.ResponseBody; +// +//@Controller +//public class SocketServerManageController { +// private final Logger logger = LoggerFactory.getLogger(this.getClass()); +// +// @Autowired +// private EchoSocketServer echoSocketServer; +// +// @RequestMapping("/manage/socket/startEchoSocketServer") +// @ResponseBody +// public String startEchoServer() { +// logger.info("starting.."); +// +// new Thread(new Runnable() { +// @Override +// public void run() { +// try { +// echoSocketServer.start(); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// }).start(); +// +// logger.info("started"); +// return "Success"; +// } +// +// @RequestMapping("/manage/socket/stopEchoSocketServer") +// @ResponseBody +// public String stopEchoServer() { +// logger.info("stopping.."); +// echoSocketServer.stop(); +// logger.info("stopped"); +// return "Success"; +// } +//}