Для частой загрузки небольших файлов самым быстрым способом было бы реализовать собственный проприетарный протокол, но это потребовало бы значительного объема работы - и это также было бы нестандартным, что означает, что будущая интеграция будет трудной, если вы не возможность реализовать ваш протокол в любом клиенте, которого вы поддерживаете. Если вы все равно решите сделать это, я предлагаю простой протокол:
- Команда: 1 байт для определения того, что будет сделано: (0x01 для запроса на загрузку, 0x02 для запроса на загрузку, 0x11 для ответа на загрузку, 0x12 для ответа на загрузку и т. Д.).
- Имя файла: может иметь фиксированный размер или префикс с длиной байта (при условии, что имя меньше 255 байтов)
- Контрольная сумма, например, MD5 (если запрос на загрузку или ответ на загрузку)
- Размер файла (если запрос на загрузку или ответ на скачивание)
- полезная нагрузка (если запрос на загрузку или ответ на загрузку)
Это может быть реализовано поверх простого сокета TCP. Вы также можете использовать UDP, избегая затрат на установление соединения, но в этом случае вам придется иметь дело с управлением повторной передачей.
Прежде чем принять решение о реализации собственного протокола, взгляните на HTTP-библиотеки, такие как libcurl, вы можете заставить свой сервер использовать стандартные HTTP-команды, такие как GET для загрузки и POST для загрузки. Это сэкономит много работы, и вы сможете протестировать загрузку с помощью любого веб-браузера.
Еще одно предложение для повышения производительности - использовать в качестве хранилища файлов не файловую систему, а что-то вроде SQLite. Вы можете создать одну таблицу, содержащую один столбец char для имени файла и один столбец blob для содержимого файла. Поскольку SQLite легок и обеспечивает эффективное кэширование, большую часть времени вы избежите накладных расходов при доступе к диску.
Я предполагаю, что вам не нужна аутентификация клиента.
Наконец: хотя C ++ - это ваше предпочтение предоставить вам сырую скорость собственного кода, редко это является основным узким местом в такого рода приложениях. Скорее всего, будет доступ к диску и пропускная способность сети. Я упоминаю об этом, потому что в Java вы, вероятно, сможете сделать сервлет, который будет делать то же самое (используя HTTP GET для загрузки и POST для загрузки) с менее чем 100 строками кода. В этом случае используйте Derby вместо SQLite, поместите этот сервлет в любой контейнер (Tomcat, Glassfish и т. Д.), И все готово.