The decision as to which way to interact with the server depends heavily on how the client will also be sending data, what type of data is sent, expected rate of transfer and traffic pattern.
For example, if you are writing a game that will allow people to come together in a virtual auditorium and play music, then you are basically doing a great deal of streaming.
If you have a multi-player pacman then you can send small packets, when the direction changes, so it won't be constant, but is bursty.
Then you can decide if you must guarantee packet order and how important every packet sent is delivered, as then you will need to look at TPC or UDP.(http://www.skullbox.net/tcpudp.php)
If you want to support 5000 clients then having that number of threads can be a performance issue, depending on how much memory, but more importantly, how many cores you have and how cpu-intensive the processing is, but, odds are it will be a performance killer.
Then you can look at select()
(http://www.lowtek.com/sockets/select.html), which would allow a smaller number of threads to handle the load, but, if you are streaming then that could be a problem as a dedicated thread makes more sense.
So, how to decide which is best depends on what type of game you are writing, as both can be useful, depending on the scenario.