2011-09-30 7 views
0

아래에 작성한 테스트 코드를 살펴보십시오. 순수 자바 사용 Authenticator를 설정하고 URI 호출을 만들어 일부 XML 데이터를 가져 와서 객체로 변환합니다.클라이언트 용 Netty HTTP Authetication

hotpotato (netty) 대 순수 java (파이프 라인 없음)의 성능을 테스트하기 위해 아래 코드를 작성했습니다.

문제는 hotpotato 또는 netty로 요청을 인증하는 방법을 알아낼 수 없다는 것입니다. 코드를 수용 할 수 있습니다. 단지 성능 차이를 테스트하고 싶습니다 (예 : 5 초 내에 요청 수를 확인하십시오.).

public static void main(String[] args) throws Exception { 
     Authenticator.setDefault(new MyAuthenticator("DummyUser", "DummyPassword")); 

     int timeToTestFor = 5000; //5 seconds; 
     int count = 0; 
     System.out.println("Start time"); 
     long starttime = System.currentTimeMillis(); 
     do { 
      URL url = new URL(
        "http://example.com/rest/GetData.ashx?what=pizza&where=new%20york&visitorId=12345&sessionId=123456"); 

      SearchResultsDocument doc = SearchResultsDocument.Factory.parse(url); 
      count++; 
     } while (System.currentTimeMillis() - starttime < timeToTestFor); 
     System.out.println("DONE Total count=" + count); 

     System.out.println("Netty/Hotpotatoe Start time"); 
     count = 0; 
     starttime = System.currentTimeMillis(); 
     do { 
      // Create & initialise the client 
      HttpClient client = new DefaultHttpClient(); 
      client.init(); 


      // Setup the request 
      HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_0, 
        HttpMethod.GET, "/rest/GetData.ashx?what=pizza&where=new%20york&visitorId=12345&sessionId=123456"); 

      // Execute the request, turning the result into a String 
      HttpRequestFuture future = client.execute("example.com", 80, request, 
        new BodyAsStringProcessor()); 
      future.awaitUninterruptibly(); 
      // Print some details about the request 
      System.out.println("A >> " + future); 

      // If response was >= 200 and <= 299, print the body 
      if (future.isSuccessfulResponse()) { 
       System.out.println("B >> "+future.getProcessedResult()); 
      } 

      // Cleanup 
      client.terminate(); 
      count++; 
     } while (System.currentTimeMillis() - starttime < timeToTestFor); 
     System.out.println("DONE Total count=" + count); 
    } 

답변

2

다음은 Netty에서만 기본 인증을 사용하는 작동 예제입니다. Jetty에서 기본 인증이 필요한 서버로 테스트되었습니다.

import java.net.InetSocketAddress; 
import java.util.concurrent.Executors; 

import org.jboss.netty.bootstrap.ClientBootstrap; 
import org.jboss.netty.buffer.ChannelBuffer; 
import org.jboss.netty.buffer.ChannelBuffers; 
import org.jboss.netty.channel.ChannelHandlerContext; 
import org.jboss.netty.channel.ChannelPipeline; 
import org.jboss.netty.channel.ChannelPipelineFactory; 
import org.jboss.netty.channel.Channels; 
import org.jboss.netty.channel.ExceptionEvent; 
import org.jboss.netty.channel.MessageEvent; 
import org.jboss.netty.channel.SimpleChannelHandler; 
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; 
import org.jboss.netty.handler.codec.base64.Base64; 
import org.jboss.netty.handler.codec.http.DefaultHttpRequest; 
import org.jboss.netty.handler.codec.http.HttpChunkAggregator; 
import org.jboss.netty.handler.codec.http.HttpClientCodec; 
import org.jboss.netty.handler.codec.http.HttpHeaders; 
import org.jboss.netty.handler.codec.http.HttpMethod; 
import org.jboss.netty.handler.codec.http.HttpResponse; 
import org.jboss.netty.handler.codec.http.HttpVersion; 
import org.jboss.netty.util.CharsetUtil; 

public class BasicAuthTest { 
private static final int PORT = 80; 
private static final String USERNAME = ""; 
private static final String PASSWORD = ""; 
private static final String URI = ""; 
private static final String HOST = ""; 

public static void main(String[] args) { 

    ClientBootstrap client = new ClientBootstrap(
      new NioClientSocketChannelFactory(
        Executors.newCachedThreadPool(), 
        Executors.newCachedThreadPool())); 

    client.setPipelineFactory(new ChannelPipelineFactory() { 

     @Override 
     public ChannelPipeline getPipeline() throws Exception { 
      ChannelPipeline pipeline = Channels.pipeline(); 
      pipeline.addLast("codec", new HttpClientCodec()); 
      pipeline.addLast("aggregator", new HttpChunkAggregator(5242880)); 
      pipeline.addLast("authHandler", new ClientMessageHandler()); 
      return pipeline; 
     } 
    }); 

    DefaultHttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, URI); 

    request.addHeader(HttpHeaders.Names.HOST, HOST); 

    String authString = USERNAME + ":" + PASSWORD; 
    ChannelBuffer authChannelBuffer = ChannelBuffers.copiedBuffer(authString, CharsetUtil.UTF_8); 
    ChannelBuffer encodedAuthChannelBuffer = Base64.encode(authChannelBuffer); 
    request.addHeader(HttpHeaders.Names.AUTHORIZATION, encodedAuthChannelBuffer.toString(CharsetUtil.UTF_8)); 

    client.connect(new InetSocketAddress(HOST, PORT)).awaitUninterruptibly().getChannel() 
      .write(request).awaitUninterruptibly(); 

} 

public static class ClientMessageHandler extends SimpleChannelHandler { 
    @Override 
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { 
     e.getCause().printStackTrace(); 
    } 

    @Override 
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { 
     HttpResponse httpResponse = (HttpResponse) e.getMessage(); 
     String json = httpResponse.getContent().toString(CharsetUtil.UTF_8); 
     System.out.println(json); 
    } 
} 

} 
+0

감사합니다. 파이프 라인을 사용한 예가 많이 감사하지만 파이프 라이닝을 사용하지 않고이를 수행 할 수 있습니까? – Ali

+0

오, 당신은'awaitUninterruptibly()'을 사용합니다. 이것은 예가 파이프 라인을 사용하지 않는다는 것을 의미합니다. – Ali

+0

파이프 라인이 원인으로 사용됩니다. HttpClientCodec가있는 파이프 라인을 의미하는 경우. 이 예제는 매우 복잡하고 실행을 멈추지 않습니다. 기본 인증은 HttpRequest의 한 헤더 일뿐입니다. (http://en.wikipedia.org/wiki/Basic_access_authentication) –