초보자 질문 - client여러개 연결 시

255 views
Skip to first unread message

김정태

unread,
Sep 5, 2022, 4:43:45 AM9/5/22
to Netty Korean User Group

public class HostBootstrap {
   public HostBootstrap(String host, int port) {
         this.host = host;
         this.port = port;
         bootstrap = new Bootstrap();
         bossGroup = new NioEventLoopGroup();
   }

   public void connect() throws Exception {
      try {
         bootstrap.group(bossGroup)
            .channel(NioSocketChannel.class)
            .remoteAddress(new InetSocketAddress(host, port))
            .handler(new HostChannelInitializer());

            //async로 실행할 수 있는 방법이 있는지요???
            ChannelFuture f = bootstrap.connect().sync();
            clientChannel = f.channel().closeFuture().sync().channel();
       } finally {
             bossGroup.shutdownGracefully().sync();
      }
   }
}

synchronized static void createHostConnection(final int count)
{
     try {
           for (int i = 0; i < 5; i++) {
              new HostBootstrap(Config.getHostIP(), Config.getHostPort()).connect();
           }
     } catch (Exception e) {
         LOGGER.error("[HostChannelPool][createHostConnection]:{}", e.getMessage());
    }
}
이렇게 실행할 경우, 1개만 연결이 됩니다. 아마도 bootstrap.connect().sync();
이부분이 sync로 되어 있어서, 저 곳에서 빠져 나오지 않는 듯 합니다.
저 부분을 빼면 연결이 되자 마자 접속을 끊어 버립니다.
접속이 종료되는 부분을 이벤트로 받는 방법은 없는것일까요??

결국 쓰레드로 여러개를 실행해서 해결하기는 했는데, 무조건 쓰레드로 해야되는것인지?
아니면, sync부분을 다른 방법으로 해결할 수 있는지 아시는 분은 답변 부탁드립니다.

//쓰레드로 여러개 실행한 코드
synchronized static void createHostConnection(final int count)
{
    try {
       for (int i = 0; i < 5; i++) {
          new Thread(new Runnable() {
           @Override
           public void run() {
              try {
                new HostBootstrap(Config.getHostIP(), Config.getHostPort()).connect();
             } catch (Exception e) {
               LOGGER.error("createHostConnection {} {}", "onCriticalPoint", e.getMessage());
            }
           }
         }).start();
        Thread.sleep(100);
        }
     } catch (Exception e) {
         LOGGER.error("[HostChannelPool][createHostConnection]:{}", e.getMessage());
    }
}

지민

unread,
Sep 26, 2024, 4:57:03 AM9/26/24
to Netty Korean User Group

오랜만에 들어와서 보다가 저도 같은 Issue를 겪었던 경험이 있어 답변을 드립니다.


[예시]

- ChannelFuture f = bootstrap.connect().sync(); 이 부분에서 sync() 메서드는 현재 쓰레드를 블로킹하여 연결이 완료될 때까지 대기합니다. 만약 이 코드가 Thread-1에서 실행되고 있다면,

- 해당 쓰레드는 소켓과 연결된 상태가 됩니다. 따라서, 동일한 쓰레드에서 다시 연결을 시도할 수 없습니다.


이런 상황에서 여러 개의 소켓에 동시에 연결하고자 한다면, 각 연결을 별도의 쓰레드에서 처리하는 것이 올바른 접근 방식입니다.

그래서 작성자 분이 하신 것처럼 연결하고 싶은 개수만큼 쓰레드를 생성하여 각각의 연결을 처리하는 것이 맞습니다.


2022년 9월 5일 월요일 오후 5시 43분 45초 UTC+9에 it.ki...@gmail.com님이 작성:
Reply all
Reply to author
Forward
0 new messages