iknowDev
Blog Driven Development
iknowDev ๐Ÿ˜
/
  • ์ž‘์„ฑ ๊ธ€ ๋ชฉ๋ก
  • Github
  • Category (30)
    • ๐Ÿ“• CS ์Šคํ„ฐ๋”” (22)
      • ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ (0)
      • Java, Spring (5)
      • ๋„์ปค, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค, ๋ฆฌ๋ˆ…์Šค (4)
      • ๋„คํŠธ์›Œํฌ (11)
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (1)
      • ๋””์ž์ธ ํŒจํ„ด (1)
      • ์ž๋ฃŒ ๊ตฌ์กฐ (0)
    • ๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋”” (4)
      • Java (3)
      • JavaScript (0)
      • Python3 (1)
    • ๐Ÿ’ป ํ† ์ด ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ๊ธฐ (2)
    • ๐Ÿš€ ๊ฒฝํ—˜ (2)
      • ์—๋Ÿฌ ๋Œ€์‘ (2)
      • ํšŒ๊ณ  (0)
      • ์ฆ๊ฑฐ์šด์ผ (0)

Popular

Tag

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค   
Was   
java   
์—๋Ÿฌ ๋Œ€์‘   
๋ฐฑ์ค€   
Spring   
side Project   
๊ณจ๋“œ   
Netty   
ํŠธ๋žœ์žญ์…˜   

Comment


Designed By hELLO
iknowDev

Blog Driven Development

๐Ÿ“• CS ์Šคํ„ฐ๋””/๋„คํŠธ์›Œํฌ

๋”ฐ๋ผํ•˜๋ฉด ๋˜๋Š” Netty ๊ธฐ๋ฐ˜ EchoServer ์˜ˆ์ œ

2023. 1. 17. 18:11
๐Ÿ’ก ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋„คํŠธ์›Œํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์ธ Netty๋ฅผ ํ•™์Šตํ•˜๋ฉฐ EchoServer๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“Œ Netty import ์„ธํŒ…

๋ฐฉ๋ฒ• 1. Maven dependency๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ• (๋งํฌ)

๋ฐฉ๋ฒ• 2. Java Build path > Libraries > Add External JARs, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ• (๋งํฌ)

netty-all-4.1.6.Final.jar
3.37MB

 

 

ํŒŒ์ผ ๊ตฌ์„ฑ

- EchoServer.java

- EchoServerHandler.java

 

๐Ÿ“Œ EchoServer.java

import io.netty.bootstrap.ServerBootstrap;
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.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.util.SelfSignedCertificate;
public final class EchoServer {

    static final boolean SSL = System.getProperty("ssl") != null;
    static final int PORT = Integer.parseInt(System.getProperty("port", "8007"));

    public static void main(String[] args) throws Exception {
        // Configure SSL.
        final SslContext sslCtx;
        if (SSL) {
            SelfSignedCertificate ssc = new SelfSignedCertificate();
            sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).build();
        } else {
            sslCtx = null;
        }

        // Configure the server.
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        final EchoServerHandler serverHandler = new EchoServerHandler();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .option(ChannelOption.SO_BACKLOG, 100)
             .handler(new LoggingHandler(LogLevel.INFO))
             .childHandler(new ChannelInitializer() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ChannelPipeline p = ch.pipeline();
                     if (sslCtx != null) {
                         p.addLast(sslCtx.newHandler(ch.alloc()));
                     }
                     //p.addLast(new LoggingHandler(LogLevel.INFO));
                     p.addLast(serverHandler);
                 }
             });

            // Start the server.
            ChannelFuture f = b.bind(PORT).sync();

            // Wait until the server socket is closed.
            f.channel().closeFuture().sync();
        } finally {
            // Shut down all event loops to terminate all threads.
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

 

๐Ÿ“Œ EchoServerHandler.java

import java.nio.charset.Charset;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

/**
 * Handler implementation for the echo server.
 */

@Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
    	String message = ((ByteBuf) msg).toString(Charset.defaultCharset());
    	System.out.println("Server ์ˆ˜์‹ ํ•œ ๋ฌธ์ž์—ด: " + message);
    	
        ctx.write(msg);
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        // Close the connection when an exception is raised.
        cause.printStackTrace();
        ctx.close();
    }
}

 

๐Ÿ“Œ Telnet ํด๋ผ์ด์–ธํŠธ ๊ธฐ๋Šฅ ์ผœ๊ธฐ

์œˆ๋„์šฐ ๊ฒ€์ƒ‰ > windows ์ž…๋ ฅ > windows ๊ธฐ๋Šฅ ์ผœ๊ธฐ/๋„๊ธฐ 

> ํ…”๋„ท ํด๋ผ์ด์–ธํŠธ ์ฒดํฌ ํ‘œ์‹œ

 

EchoServer.java์—์„œ Run์„ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  telnet localhost 8007 ์ž…๋ ฅ

Telnet localhost๋กœ ์ ‘์†ํ–ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

hello ์ž…๋ ฅ

์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด์„ Echoํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ˆ˜์‹ ํ•œ ๋ฌธ์ž์—ด์ด ์ดํด๋ฆฝ์Šค ์ฝ˜์†”์— ์ฐํžŒ๋‹ค.

EchoServer Console

ctrl + ] ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

q๋ฅผ ์ž…๋ ฅํ•ด ํ…”๋„ท ์„ธ์…˜์—์„œ ๋น ์ ธ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

๐Ÿ“Œ ๊ฐœ์„  EchoServerHandler.java

+) ์—”ํ„ฐ๋ฅผ ์ž…๋ ฅํ•ด ํ•œ ์ค„์˜ ๋ฌธ์ž์—ด์„ ์ˆ˜์‹ ํ•˜๋Š” ์ฝ”๋“œ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
	StringBuilder builder = new StringBuilder();
	
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
    	String message = ((ByteBuf) msg).toString(Charset.defaultCharset());
    	builder.append(message);
    	
    	int command = message.toLowerCase().charAt(0) - 'a';
    	if(command == -84) {
        	System.out.println("Server ์ˆ˜์‹ ํ•œ ๋ฌธ์ž์—ด: " + builder.toString());
        	builder = new StringBuilder();
    	}
    	
		ctx.write(msg);
    }
    ...
}

๋ฌธ์ž์—ด ์ž…๋ ฅ ํ›„ ์—”ํ„ฐ ์ž…๋ ฅ ์‹œ ๋ฌธ์ž์—ด์„ ์ˆ˜์‹ ํ•œ๋‹ค.

EchoServer Console

 

(์ฑ… ใ€Ž์ž๋ฐ”๋„คํŠธ์›Œํฌ ์†Œ๋…€ ๋„คํ‹ฐใ€์˜ ์˜ˆ์ œ)

 

GitHub - krisjey/netty.book.kor: ์ž๋ฐ” ๋„คํŠธ์›Œํฌ ์†Œ๋…€ ๋„คํ‹ฐ ์˜ˆ์ œ

์ž๋ฐ” ๋„คํŠธ์›Œํฌ ์†Œ๋…€ ๋„คํ‹ฐ ์˜ˆ์ œ. Contribute to krisjey/netty.book.kor development by creating an account on GitHub.

github.com

    '๐Ÿ“• CS ์Šคํ„ฐ๋””/๋„คํŠธ์›Œํฌ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [WEB] ๐ŸŒ ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ๋™์ž‘ ์›๋ฆฌ - ์ฃผ์†Œ์ฐฝ์— URL ๊ฒ€์ƒ‰ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •
    • ๋”ฐ๋ผํ•˜๋ฉด ๋˜๋Š” Netty ๊ธฐ๋ฐ˜ ๊ฐ„๋‹จํ•œ Live Chat ์„œ๋ฒ„ ์˜ˆ์ œ
    • JAVA ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ์†Œ์ผ“ ํ†ต์‹  ๐Ÿ‘‰ netty
    • [CS] #2. ๋„คํŠธ์›Œํฌ - (URL / URI), REST API
    iknowDev
    iknowDev
    iknowDev ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ SSAFY 8๊ธฐ Java

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”