RFC455 defines that, generally, a WebSocket client should not close a TCP connection as far as a server is the one who's responsible for doing that. In practice, when I do not control the server, this might lead to connections leak if the server does not comply with the RFC.
RFC455#7.1.1 says
In abnormal cases (such as not having received a TCP Close from the server after a reasonable amount of time) a client MAY initiate the TCP Close.
I suggest to add forceCloseAfterMillis option to WebSocketClientHandshaker (and to WebSocketClientProtocolHandler appropriately) and schedule a channel close when necessary after CloseWebSocketFrame being flushed here. If there's no objections, I'm happy to provide a PR.