users@grizzly.java.net

Re: how to detect a client that close his connection to the server ?

From: Jeanfrancois Arcand <Jeanfrancois.Arcand_at_Sun.COM>
Date: Thu, 13 Nov 2008 10:58:32 -0500

Salut

John ROM wrote:
> Isn't the close difficutly everywhere in grizzly not just on reads
>
> for example in the moment even when application logic knows that
> client will closed connection there may be write records left in the async write queue
> which will then of course fails.

Right, and with OutputWriter, you will get the proper exception
(IOException("Client disconnected");

I think we are missing case for:

+ read
+ asyncRead/Write

We may not be able to detect all scenario, but we can at least come with
our best "guess".

A+

-- jeanfrancois


>
>
>
>
>
> -------- Original-Nachricht --------
>> Datum: Thu, 13 Nov 2008 16:43:21 +0100
>> Von: Oleksiy Stashok <Oleksiy.Stashok_at_Sun.COM>
>> An: users_at_grizzly.dev.java.net
>> Betreff: Re: how to detect a client that close his connection to the server ?
>
>>> Jeanfrancois Arcand wrote:
>>>> Salut,
>>>> Jeanfrancois Arcand wrote:
>>>>> Salut,
>>>>>
>>>>> Oleksiy Stashok wrote:
>>>>>> Hi Sebastien,
>>>>>>
>>>>>> you can easily add custom Filter before ReadFilter.
>>>>>> Implement postExecute method, with approx. following code:
>>>>>>
>>>>>> public boolean postExecute(Context ctx) throws IOException {
>>>>>>
>>>>>> final Context.KeyRegistrationState state =
>>>>>> ctx.getKeyRegistrationState();
>>>>>>
>>>>>> if (state == Context.KeyRegistrationState.CANCEL){
>>>>>> notifyConnectionClosed();
>>>>>> }
>>>>>> }
>>>>> hum. Not sure it will works because one of the Filter can always
>>>>> set the KeyRegistrationState to CANCEL.
>>>> I need to avoid starting working too early ;-) Of course no Filter
>>>> will be invoked when the connection is closed :-)
>>>> Forget me!
>>> Naaa I think I was right at the first place :-) Your example will
>>> works but there is also chance that other filters set the value to
>>> cancel, and it will be hard from the Filter to detect if the client
>>> closed the connection or if the filter asked to close it.
>>>
>>> So I guess we need to add something :-) :-)
>> I think, in general it's very difficult to understand if client closed
>> connection or not. I would not rely on that...
>> To put some check in ReadFilter, when -1 is read, is not enough,
>> because connection could be closed inside protocol parser or any other
>> piece of code.
>> I think it's quite tricky scenario, when you really need to
>> distinguish situations, where client initialized connection close or
>> server.
>>
>> WBR,
>> Alexey.
>>
>>>
>>> A+
>>>
>>> -- Jeanfrancois
>>>
>>>
>>>
>>>> -- Jeanfrancois
>>>> I would propose we add a way to get
>>>>> notified when the client close the connection in ReadFilter
>>>>> (specially with ProtocolParser, because you can't override the
>>>>> ReadFilter.execute() method. What do you think?
>>>>>
>>>>> A+
>>>>>
>>>>> -- Jeanfrancois
>>>>>
>>>>>
>>>>>>
>>>>>> Hope this will help.
>>>>>>
>>>>>> WBR,
>>>>>> Alexey.
>>>>>>
>>>>>>
>>>>>> On Nov 13, 2008, at 4:08 , Survivant 00 wrote:
>>>>>>
>>>>>>> yes I'm using a ProtocolParser..
>>>>>>>
>>>>>>> QuoteQueryProtocolFilter protocolParser = new
>>>>>>> QuoteQueryProtocolFilter();
>>>>>>>
>>>>>>> :)
>>>>>>>
>>>>>>> I'll put a flag on my thread. I need to fix that before putting
>>>>>>> my application in test.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> 2008/11/12 Jeanfrancois Arcand <Jeanfrancois.Arcand_at_sun.com
>> <mailto:Jeanfrancois.Arcand_at_sun.com
>>>>>>> Salut,
>>>>>>>
>>>>>>>
>>>>>>> Survivant 00 wrote:
>>>>>>>
>>>>>>> I just find a bug in my application. I don't know how to
>>>>>>> get
>>>>>>> notify when I client close the connection with the
>>>>>>> server. (TCP)
>>>>>>>
>>>>>>>
>>>>>>> I can't remember when we talked about that, but I was under the
>>>>>>> impression the ReadFilter has an API to register listener
>>>>>>> when the
>>>>>>> connection get closed. But looking at the code, I guess I've
>>>>>>> dreamed....
>>>>>>>
>>>>>>> The solution is to write your own SelectionKeyHandler and
>>>>>>> monitor
>>>>>>> the SelectionKey that are closed. But I don't really like the
>>>>>>> solution.
>>>>>>>
>>>>>>> The logic should really be in ReadFilter, but I suspect you are
>>>>>>> using ProtocolParser and let me investigate more...Alexey and
>>>>>>> John
>>>>>>> might wakes faster than me on that :-)
>>>>>>>
>>>>>>> A+
>>>>>>>
>>>>>>> -Jeanfrancois
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> here the init of the server
>>>>>>>
>>>>>>> public void init(){
>>>>>>> System.out.println("listening for incoming TCP
>>>>>>> Connections on port : " + f_port);
>>>>>>> try {
>>>>>>> f_controller = new Controller();
>>>>>>> TCPSelectorHandler tcpSelectorHandler = new
>>>>>>> TCPSelectorHandler();
>>>>>>> tcpSelectorHandler.setPort(f_port);
>>>>>>>
>>>>>>> Pipeline pipeline = new DefaultPipeline();
>>>>>>> pipeline.setMaxThreads(5);
>>>>>>> f_controller.setPipeline(pipeline);
>>>>>>>
>>>>>>> tcpSelectorHandler.setSelectionKeyHandler(new
>>>>>>> BaseSelectionKeyHandler());
>>>>>>>
>>>>>>> f_controller.addSelectorHandler(tcpSelectorHandler);
>>>>>>> QuoteQueryProtocolFilter
>>>>>>> protocolParser =
>>>>>>> new QuoteQueryProtocolFilter();
>>>>>>> QuoteQueryManagerFilter quoteManagerFilter = new
>>>>>>> QuoteQueryManagerFilter(f_quoteManager);
>>>>>>> final ProtocolChain protocolChain = new
>>>>>>> DefaultProtocolChain();
>>>>>>> protocolChain.addFilter(protocolParser);
>>>>>>> protocolChain.addFilter(quoteManagerFilter);
>>>>>>> ((DefaultProtocolChain)
>>>>>>> protocolChain).setContinuousExecution(true);
>>>>>>>
>>>>>>>
>>>>>>> ProtocolChainInstanceHandler pciHandler = new
>>>>>>> DefaultProtocolChainInstanceHandler() {
>>>>>>>
>>>>>>> public ProtocolChain poll() {
>>>>>>>
>>>>>>> return protocolChain;
>>>>>>> }
>>>>>>>
>>>>>>> public boolean offer(ProtocolChain
>>>>>>> protocolChain) {
>>>>>>> return false;
>>>>>>>
>>>>>>> }
>>>>>>> };
>>>>>>>
>>>>>>>
>>>>>>> f_controller.setProtocolChainInstanceHandler(pciHandler);
>>>>>>> try {
>>>>>>> f_controller.start();
>>>>>>> } catch (IOException e) {
>>>>>>> e.printStackTrace();
>>>>>>> }
>>>>>>> } catch (Exception e) {
>>>>>>> System.exit(-10);
>>>>>>> }
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: users-unsubscribe_at_grizzly.dev.java.net
>>>>>>> <mailto:users-unsubscribe_at_grizzly.dev.java.net>
>>>>>>> For additional commands, e-mail: users-
>>>>>>> help_at_grizzly.dev.java.net
>>>>>>> <mailto:users-help_at_grizzly.dev.java.net>
>>>>>>>
>>>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscribe_at_grizzly.dev.java.net
>>>>> For additional commands, e-mail: users-help_at_grizzly.dev.java.net
>>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe_at_grizzly.dev.java.net
>>>> For additional commands, e-mail: users-help_at_grizzly.dev.java.net
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe_at_grizzly.dev.java.net