Generally speaking, the ideal server would a few threads -- I'd say about 5, but that number would depend on the type of server you're creating and the target machine you're running on. You don't want a new thread for every connection because the overhead will multiply for every connection, and you don't really need that many threads anyways.
You can also do a single thread. This is much easier to actually write code for, and as a free bonus you never have to worry about synchronization. If your packet handlers are all going to execute very quickly, and especially if your target machine has only a single core, this may be acceptable.