The fact that a protocol technically is not perfect and causes jip for isps does not mean the application layer has to get involved.
I've been writing tcp based apps for years and the stream abstraction has never failed me. After reading this I dont see why I should change that assumption? I have to rebuild connections occasionally but its never cost my application so much that an alternative more complicated abstraction layer made sense. I usually write req/response over tcp, an even more inaccurate abstraction. Occasionally nonblocking code. Never have I wanted more complexity than nio in my application layer.
Devs do know that "tcp is not a stream of bytes" but deliberately do not want to get app code involved.