TcpSockets are bidirectional, and you just have to open port and forward ports to establish a connection. That's what the TcpListener is for, and that is just needed on the server side in most cases (unless you want a Peer-to-Peer topology).
Once a TcpSocket connects to a server, which is listening on a specific port and will accept connections, there will be some handshakes which will establish a connection on a
ephemeral port.
So once connected you can send
and receive data from a TcpSocket, and you just have to manage these TcpSocket objects, so that it sends data to the right client, and can distinguish which TcpSocket on the server is which client.
If you want to handle multiple clients with SFML you might want to take a look at the SocketSelector class, which also includes a nice example.
If you use UDP and want to use it bidirectional, then yeah you must also open ports on the client side.