This is way too much code to expect us to go through (especially since you've mentioned that its not complete), and given that its homework you cannot expect a rewrite to happen.
What has stepping through a debugger revealed for this? I've never built a client/server communication with java quite the way you have here (I've never had a reason to socket with java). In java, I'd typically throw the communication against an RMI instead as its fairly simple to use (though there is nothing wrong with socketing it if you like). The only purpose I can really see with multithreading this is to allow the server to communicate with multiple clients and push the messages around if necessary (multiple clients can see each other, also something rmi can do), much like a chat program. The other threads would be simple since they would be on the clients allowing them to receive responses at the same time they send requests (optional of course, can be updated during repaints instead).
So I guess what I'm getting at here, is I'm not really sure what kind of help you are needing to do with this. I don't have the time to even look through this much code, let alone debug it. If you can get it down to more specific problems (ie: threads failing, deadlocking, etc), then we have an actual spot to look at. But without particular issues, this is an open 'not working' application, which really isn't all that helpful I'm afraid.
header('HTTP/1.1 420 Enhance Your Calm');