I don't know much about SocketChannel, but I think ByteBuffer.allocateDirect() is a good choice for you.
Just read the socket. Data in ByteBuffer.allocateDirect() and let socket B read it simple and easy.
Here are the differences:
1. The old way
SocketA -> BufferA (kernel space) -> BufferB (user space)
BufferB (user space) -> BufferC (kernel space) -> SocketB
2. Zero copy path
SocketA -> DirectBuffer (access to it from the kernel and user space)
DirectBuffer โ SocketB
Note
IMHO, I donโt think we can do this directly SocketA -> SocketB , os need to load data into physical memory before sending it.
========= EDIT ==========
According to the article you mentioned, FileChannel transferTo do this as follows:

Use ByteBuffer.allocateDirect() , you do not need to switch the context between the kernel and user space. A single buffer is mapped to physical memory, while reading and sending use the same blocks.
MrROY
source share