2015-02-05 2 views
0

Я хочу знать, могу ли я сохранить свои приложения при помощи Netty Client.Преимущества клиента Netty через клиента ввода-вывода?

Я написал демо-клиента, пожалуйста, найдите нижеприведенный код. Ожидая, что один поток может подключаться к другому порту, обрабатывать их эффективно, но я ошибался. Netty создает соединение с потоком.

public class NettyClient { 
    public static void main(String[] args) { 
    Runnable runA = new Runnable() { 
     public void run() { 
      Connect(5544); 
     } 
    }; 

    Thread threadA = new Thread(runA, "threadA"); 
    threadA.start(); 

    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException x) { 
    } 

    Runnable runB = new Runnable() { 
     public void run() { 
      Connect(5544); 
     } 
    }; 

    Thread threadB = new Thread(runB, "threadB"); 
    threadB.start(); 

} 

static ClientBootstrap bootstrap = null; 
static NettyClient ins = new NettyClient(); 
public NettyClient() { 

    bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(
      Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); 
    /* 
    * ClientBootstrap A helper class which creates a new client-side 
    * Channel and makes a connection attempt. 
    * 
    * NioClientSocketChannelFactory A ClientSocketChannelFactory which 
    * creates a client-side NIO-based SocketChannel. It utilizes the 
    * non-blocking I/O mode which was introduced with NIO to serve many 
    * number of concurrent connections efficiently 
    * 
    * There are two types of threads :Boss thread Worker threads Boss 
    * Thread passes control to worker thread. 
    */ 
    // Configure the client. 

    ChannelGroup channelGroup = new DefaultChannelGroup(NettyClient.class.getName()); 
    // Only 1 thread configured but still aceepts threadA and Thread B 
    // connection 
    OrderedMemoryAwareThreadPoolExecutor pipelineExecutor = new OrderedMemoryAwareThreadPoolExecutor(
      1, 1048576, 1073741824, 1, TimeUnit.MILLISECONDS, 
      new NioDataSizeEstimator(), new NioThreadFactory("NioPipeline")); 

    bootstrap.setPipelineFactory(new NioCommPipelineFactory(channelGroup, 
      pipelineExecutor)); 

    // bootstrap.setPipelineFactory(new 
    // BackfillClientSocketChannelFactory()); 
    bootstrap.setOption("child.tcpNoDelay", true); 

    bootstrap.setOption("child.keepAlive", true); 
    bootstrap.setOption("child.reuseAddress", true); 
    bootstrap.setOption("readWriteFair", true); 
} 

public static NettyClient getins() { 
    return ins; 
} 

public static void Connect(int port) { 
    ChannelFuture future = bootstrap 
      .connect(new InetSocketAddress("localhost", port)); 

    Channel channel = future.awaitUninterruptibly().getChannel(); 
    System.out.println(channel.getId()); 
    channel.getCloseFuture().awaitUninterruptibly(); 
} 

}

Теперь я хочу знать, каковы преимущества использования Netty клиента? Сохраняет ли он Threads?

ответ

1

Netty сохраняет темы. Ваш NettyClient переносит потоки, ожидая синхронно для открытия и закрытия соединений (вызов awaitUninterruptibly()).

BTW Сколько соединений будет у вашего клиента? Возможно, достаточно использовать классический синхронный подход с одним потоком на один канал? Обычно мы должны сохранять потоки на стороне сервера.

0

Netty позволяет обрабатывать тысячи соединений с рядом ниток.. При использовании в клиентском приложении позволяет нескольким потокам делать тысячи одновременных подключений к серверу.

Вы положили sleep() в свою нить. Мы должны никогда заблокировать потоки работника/хозяина Netty. Даже если необходимо выполнить какую-либо одноразовую операцию блокировки, она должна быть отключена другим исполнителем. Netty использует NIO, и тот же поток может использоваться для создания нового соединения, в то время как более раннее соединение получает некоторые данные в своем входном буфере.

Смежные вопросы