2011-03-30 1 views
2

Я пытаюсь проверить netty, но когда я создаю несколько клиентов для подключения к серверу, некоторые из клиентов просто замерзают и не заканчиваются. Вот мой код (в основном я использовал код из ее https://github.com/brunodecarvalho/netty-tutorials и просто изменить его на использование нескольких клиентов):Netty замерз с подключением нескольких клиентов


for (int i = numthr; i > 0; i--) { 
      Runnable runner = new Runnable() { 
       public void run() { 
        final Client client = new Client("localhost", 10400, nummes, 0); 
        if (!client.start()) { 
         System.exit(-1); 
         return; 
        } 
        client.flood(); 
        Runtime.getRuntime().addShutdownHook(new Thread() { 
         @Override 
         public void run() { 
          client.stop(); 
         } 
        }); 
       } 
      }; 
      executor.execute(runner); 
     } 

    public void messageReceived(Envelope message) { 

     if (this.received.incrementAndGet() == this.messages) { 

      System.out.println(nmb.incrementAndGet()); 


     } 
    } 

    public boolean start() { 

     // For production scenarios, use limited sized thread pools 
     this.clientFactory = new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), 
                   Executors.newCachedThreadPool(),1); 
     this.channelGroup = new DefaultChannelGroup(this + "-channelGroup"); 
     this.handler = new ClientHandler(this, this.channelGroup); 
     ChannelPipelineFactory pipelineFactory = new ChannelPipelineFactory() { 

      @Override 
      public ChannelPipeline getPipeline() throws Exception { 
       ChannelPipeline pipeline = Channels.pipeline(); 
       pipeline.addLast("encoder", new Encoder()); 
       pipeline.addLast("decoder", new Decoder()); 
       pipeline.addLast("handler", handler); 
       return pipeline; 
      } 
     }; 

     ClientBootstrap bootstrap = new ClientBootstrap(this.clientFactory); 
     bootstrap.setOption("reuseAddress", true); 
     bootstrap.setOption("tcpNoDelay", true); 
     bootstrap.setOption("keepAlive", true); 
     bootstrap.setPipelineFactory(pipelineFactory); 


     boolean connected = bootstrap.connect(new InetSocketAddress(host, port)).awaitUninterruptibly().isSuccess(); 
     if (!connected) { 
      this.stop(); 
     } 

     return connected; 
    } 

     this.serverFactory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), 
                   Executors.newCachedThreadPool()); 
     this.channelGroup = new DefaultChannelGroup(this + "-channelGroup"); 
     ExecutionHandler executionHandler = new ExecutionHandler(
       new MemoryAwareThreadPoolExecutor(270, 1048576, 1048576)); 

     ServerBootstrap bootstrap = new ServerBootstrap(this.serverFactory); 
     bootstrap.setPipelineFactory(
       new DatabaseGatewayPipelineFactory(executionHandler)); 
     bootstrap.setOption("reuseAddress", true); 
     bootstrap.setOption("child.tcpNoDelay", true); 
     bootstrap.setOption("child.keepAlive", true); 
     bootstrap.setOption("child.connectTimeoutMillis", 10000); 

     Channel channel = bootstrap.bind(new InetSocketAddress(this.host, this.port)); 
     if (!channel.isBound()) { 
      this.stop(); 
      return false; 
     } 

     this.channelGroup.add(channel); 

ответ

1

Код вводит новую тему для Client каждый раз, с таким же номером порта. Это может создать проблемы, поскольку несколько потоков обрабатывают сообщения на одном и том же порту.

-1

Вызывать System.exit (-1); будет прервать JVM, в то время как другой клиентский поток все еще может быть активным. Это поведение необходимо?

+0

Я бы сказал, что это не имеет значения. Эта строка будет работать только в случае некоторой ошибки, когда клиент не запустился. И он не запускается – Aldarund

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

  • Нет связанных вопросов^_^