Internet Chat System
For this part, develop an Internet chat system, based on a client/server architecture, using Java/C++, and exploiting the TCP protocol.
 Your system should allow one to connect multiple remote clients to a single central server.
 When a user enters a text message on his/her client, the message is delivered through the server and displayed by any other client that is currently connected to the server, including the original sending client.
 Users can join and leave the chat at any time, provided the server is up.
 When joining, users choose nicknames, which will appear along with their individual messages. The server address must also be specified when running the client.
The implementation should avoid unnecessary details, however, some visual/graphical interface should be used. For simplicity, flashy graphics and other similar features can be avoided and there will be no credit given for such features. Nonetheless, the following implementation features are required:
 When the user is typing, incoming messages must be buffered in order to avoid any overlap. They will be displayed later, once the user has entered his/her message.
 The overall system must be robust with respect to client crashes and/or blocked connections, i.e., any problem with a single client must not affect the other users.
You are asked to:
1. Write all the requirements for the system, including any necessary diagram.
2. Describe your algorithm design, showing what interactions occur between the clients and the server.
3. Develop a TCP-based Java/C++ implementation of both client and server. The Java/C++ code should be
– robust (proper treatment of exceptions and odd cases),
– well written (clear structure, meaningful identifier names, etc.),
– properly commented (general structure, purpose of your classes and methods, concurrency of possible threads).
4. Test your implementation and report on possible bugs and/or unexpected behaviours you should find.
Note: One can add any other additional features if needed but these features must be justified and explained in details. Also one can make assumptions as required but explanations must be given for any such assumptions