RMNP стремится объединить все преимущества TCP и скорость UDP, чтобы быть достаточно быстрым для поддержки современных игр в реальном времени, таких как шутеры от первого лица. По сути, это расширение UDP.
Плохая сторона TCP заключается в том, что после потери пакета он прекращает отправку всех остальных пакетов до тех пор, пока не будет доставлен недостающий. Это может стать огромной проблемой для игр, чувствительных ко времени, поскольку устройства нередко сталкиваются с потерей пакетов. Поэтому RMNP облегчает UDP, чтобы гарантировать быструю доставку без каких-либо ограничений. Поскольку UDP не сохраняет состояние, RMNP реализует простой способ управления соединением и различения «подключенных» клиентов. Каждый пакет содержит небольшой заголовок, в основном содержащий хэш CRC32, чтобы гарантировать, что все полученные пакеты были переданы правильно.
Чтобы гарантировать надежность, получатель отправляет пакеты подтверждения обратно, чтобы сообщить отправителю, какие пакеты он получил. Отправитель повторно отправляет каждый пакет до тех пор, пока не получит подтверждение или не будет достигнут максимальный таймаут. Из-за этого RMNP не является надежным на 100%, но можно предположить, что пакет будет доставлен, если у клиента потеря пакетов не составит около 100% в течение пары секунд.
go get github.com/obsilp/rmnp
Пример понг-сервера
package main
import "github.com/obsilp/rmnp"
func main () {
server := rmnp . NewServer ( ":10001" )
server . Start () // non-blocking
// other code ...
}
Пример пинг-клиента
package main
import "github.com/obsilp/rmnp"
func main () {
client := rmnp . NewClient ( "127.0.0.1:10001" )
client . Connect () // non-blocking
// other code ...
}
События и полученные пакеты можно получить, установив обратные вызовы. Посмотрите соответствующие классы для получения дополнительной информации.
Обратные вызовы клиентов | Обратные вызовы сервера
Этот проект лицензируется по лицензии MIT — подробности см. в файле ЛИЦЕНЗИИ.