You MUST design a binary protocol for client/server communications.
A binary protocol, in contrast with a text protocol, is a protocol where all data is transmitted in binary format, either raw (as-is from memory) or with some specific encoding optimized for data transmission.
Put it in other terms, prior to transmission, data is NOT converted to clear-text strings separated by end-of-line or other character (typical null-terminated const char* or std::string).
For example an integer is transmitted as-is, and not as a textual representation of the number: this is considered to be “binary” mode.
Be careful of the Boost::serialization library, and in particular boost::archive::text, as it could be used to serialize data to text data before transmission, which is not the goal you want to achieve with a binary mode protocol.
You MUST use UDP for communications between the server and the clients.
A second connection using TCP can be tolerated, but you MUST provide a strong justification.
In any event, ALL in-game communications MUST use UDP.
UDP works differently than TCP, be sure to understand well the difference between datagram-oriented (or bounded messages) communication VS stream-oriented communication.
Think about your protocol completeness, and in particular, the handling of erroneous messages. Such malformed messages or packets MUST NOT lead the client or server to crash.
You MUST document your protocol. See the previous section on documentation for more information about what is expected for the protocol documentation.
This project is a network game: as such, the communication protocol is a critical part of the system.
Documentation of the network protocol shall describe the various commands and packets sent over the network between the server and the client.
Someone SHOULD be able to write a new client for your server, just by reading the protocol documentation.