You have closed the channel and are still trying to use it.
There are several issues with your code.
First, your test for EOS is faulty. Remove the limit() == 0 test. That
doesn’t indicate EOS, it just indicates a zero length read, which can
happen in non-blocking mode at any time. It doesn’t mean the peer has
closed his end of the connection, and it doesn’t mean you should close
your end.
Second, closing a channel closes the socket as well. You should close
the channel only, not the socket.
Third, closing a channel cancels the key. You don’t need to follow
every close with a cancel.
You may also have failed to check whether a ready key is valid in the
select loop before using it, e.g. for reading.