Long time ago I made a software, which had the chat module with TCP/IP : sockets.
At the beginning for each client it was 2 Thread: the ReaderThread and the WriterThread. It wasn't enough, because the clients get disconnected. I needed to make an InactivityChecker thread too, because the reader wasn't able to detect disconnections at server side, and the writer only when he had message. 3 thread / client is a bit waste of the resources, but it can go up to 5000 simultaneous clients!! -it will eat your processors with context switching! Also has must take care of the maximum port numbers opened.
If you would like to allow more than 65525/2 clients "simultaneously" for technical reasons the asynchron way is the only was to go.