# Message Format
---
B = Byte
Control(1B) or Status(1B) or Count(4B) + [Size(4B) + Data(Size)] * N
---
Each "[Size(4B) + Data(Size)]" is a datablock, i.e. the "username", "password".... below are all of this format.
Client always send a control code of 1 byte, and additional data if applicable.
Server always return a status code of 1 byte or count of following datablock of 4 byte, and additional data if applicable.
## Client
### Login:
Login with username and password.
Format: 0(1B) + username + password
Server returns 1(1B) if success, 0(1B) if no such account.
### Register:
Register with username and password.
Format: 1(1B) + username + password
Server returns 1(1B) if success, 0(1B) if error.
Close connection afterwards.
### Query History
Get chat history with username. Only valid after login.
Format: 2(1B)
Server returns 'number of records'(4B) + (username size + username + data size + data) * N
For file transmission records, simply use its filename as text.
### Chat
Send message to username. Only valid after login.
Format: 3(1B) + username + chat content
Server returns 1(1B) if success, 0(1B) if error.
### File Transfer
Send file to username. Only valid after login and if the destination is online.
Format: 4(1B) + username + filename + file
Server returns 1(1B) if success, 0(1B) if error.
### Logout
Logout with current account.
Format: 5(1B)
Server returns 1(1B) if success, 0(1B) if error.
### Peek text
Ask server to send all text messages since last peek.
Format: 13(1B)
Server returns 'number of records'(4B) + (username size + username + data size + data) * N
### Peek file
Ask server to send all file messages since last peek.
Format: 14
Server returns 'number of records'(4B) + (username size + username + filenamesize + filename + data size + data) * N