Попробуйте переработать приложение, добавив подтверждение об отправке сообщений как в сервер, так и в клиент.
Добавьте возможность ввести слово Exit в чате клиента, чтобы можно было завершить его работу. В коде сервера добавьте ожидание нажатия клавиши, чтобы также прекратить его работу.
Добавьте использование Cancellationtoken в код сервера, чтобы можно было правильно останавливать работу сервера.
Структурируйте код клиента и сервера чата, используя знания о шаблонах.
Реализуйте тип сообщений List, при котором клиент будет получать все непрочитанные сообщения с сервера.
Продумайте, как можно протестировать код клиента по аналогии с кодом сервера.
Доработайте чат, заменив UDP-сокеты на NetMQ. Для этого напишите новую библиотеку, где в которой вы имплементируется IMessageSource и IMessageSourceClient с применением указанной библиотеки.