2011-12-13 11 views
5

Sto provando a mettere insieme un client Netty. Devo inviare una richiesta a un server (che non controllo) e mi aspetto una risposta.Client piccolo, come ottenere una risposta da una richiesta inviata al server

Non sono esattamente sicuro di come ottenere la risposta.

Quindi, se ho avuto:

ChannelFuture future = bootstrap.connect(new InetSocketAddress("foo.com", 1654)); 
Channel connector = future.awaitUninterruptibly().getChannel(); 
ChannelFuture response = connector.write(query); 

Come faccio ad avere i dati di risposta dalla risposta ChannelFuture? Devo aggiungere un ChannelHandler alla pipeline bootstrap? In tal caso, come associo la risposta alla richiesta?

Grazie,

+0

Forse finalmente trovare la risposta alla tua domanda, perché ho questa stessa domanda ... –

risposta

2

Sì è necessario aggiungere un ChannelHandler. Il modo più semplice nel tuo caso sarebbe quello di estendere SimpleChannelUpstreamHandler e sovrascrivere il metodo channelConnected(…) e il metodo messageReceived(…). In channelConnected si accende il Channel.write(…) e in si riceve la risposta. Se le risposte possono venire in un ordine diverso, allora le scritture devono scrivere il proprio codice di gestione.

Un'altra soluzione potrebbe essere quella di aggiungere un SimpleChannelUpstreamHandler alla pipeline prima di chiamare scrivere. Qualcosa del genere:

channel.getPipeline().addLast("yourHandlerName", new SimpleChannelUpstreamHandler()) { 
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { 
     // remove handler after receiving response 
     ctx.getPipeline().remove(this); 

     // do logic 
     ... 
     } 
}); 
+2

Grazie per rispondere a questa; è difficile credere che il "ChannelFuture" non si comporti come ... un "Futuro". Ho cercato su Google per l'incredulità e finalmente ho trovato il tuo post qui che esaminava le cose contrassegnate con "netty". Ho notato che sei coinvolto in un problema per l'alfa 4.0 per quanto riguarda questo - qualsiasi movimento? Così come sono andato con l'implementazione di un'interfaccia 'Risposta ' implementata dalla sottoclasse 'ChannelHandler'. Passo questo e il 'ChannelFuture' al costruttore di una classe che implementa' Future 'e funge da wrapper. Volevo impiccarmi. –

2

In primo luogo, è possibile fare riferimento al campione di ora locale. Nel gestore di "LocalTimeClientHandler", puoi trovare il trucco per bloccare la richiesta/risposta.

Ma questo è ancora un "ciao mondo" progetto vetrina, quindi ci sono ancora 2 numeri dobbiamo considerare:

  1. L'idea in questo campione è quello di inviare un batch una volta e tornare una risposta una volta. Quindi non è adatto per il pattern di produzione da inviare continuamente riutilizzando lo stesso canale.

  2. Se si desidera inviare le richieste e ottenere le risposte corrette il prima possibile con un carico elevato, è necessario ridefinire la coda un po 'di più altrimenti le prestazioni sono davvero scarse.