3

所以我有一个基于 netty 的 websockets 客户端,用于性能测试。我的想法是我可以用它来模拟 100、1000 等同时连接。

我已经确定我目前的解决方法是行不通的——测试工具根本没有创建足够的 websocket 连接,尽管它很愉快地颠簸,认为它仍然是连接的,等等。但我的服务器根本没有显示正确的数量当我使用这个测试工具时的连接。我认为最有可能发生这种情况是因为我同时在多个线程中使用 netty 库中的各种对象,并且它们处理得不是很好。例如,客户端引导程序。

这就是我每个线程正在做的事情。你能告诉我哪里出了问题,以便我可以修复我的测试工具吗?

public void run(){
    try{

       // client bootstrap.  There is one of these per thread.  is that part of the problem?
       ClientBootstrap bootstrap = new ClientBootstrap(new NIOClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool())));

       Channel ch = null;

       try{
           // set up ssl engine
           final SSLEngine engine = createServerContext().createSSLEngine();
           engine.setUseClientMode(true);

           // there is a new handhsaker per thread, too.  They all go to the same uri 
           final WebSocketClientHandshaker handshaker = new WebSocketClientHandhsakerFactory().newHandshaker(uri, WebSocketVersion.V08, null, false, null);   

           // set up the pipeline factory and pipeline
           bootstrap.setPipelineFactory(new ChannelPipelieFactory(){

               @Override
               public Channelpipeline getPipeline() throws Exception(){
                   ChannelPipeline pipeline = Channels.pipeline();
                   pipeline.addLast("ssl", new SslHandler(engine));
                   pipeline.addLast("encoder", new HttpRequestEncoder();
                   pipeline.addLast("decoder", new HttpResponseDecoder();
                   // WebSocketClientHandler code not included, it's just a custom handler that sends requests via websockets 
                   pipeline.addLast("ws-handler", new WebSocketClientHandler(handshaker);
                   return pipleline;
               }
            });

           // connect websockets preflight over http
           ChannelFuture future = bootstrap.connect(new InetSocketAddress(uri.getHost(), uri.getPort());
           future.sync();

           // do websockets handshake
           ch = future.getChannel();
           ChannelFuture handshakeFuture = handshaker.handshake(ch);
           handshakeFuture.syncUninterruptably();
           Thread.sleep(1000);  // i had to add this.  Sync should have meant that the above method didn't return until it was complete... but that was a lie.  So I sleep for 1 second to solve that problem.  

           if(!handshakeDuture.isSuccess())
               System.out.println("WHOAH errror");

           // send message to server
           ch.write(new TextWebSocketFrame("Foo"));

           // wait for notifications to close
           while(!getShutdownNow().get())  // shutdownNow is an atomicBoolean which is set to true when all my threads have been started up and a certain amount of time has passed
              Thread.sleep(2000);


           // send close; wait for response
           ch.write(new CloseWebSocketFrame());
           ch.getCloseFuture().awaitUninterruptibly();



           }

       }
    }
}
4

0 回答 0