RMNP zielt darauf ab, alle Vorteile von TCP und die Geschwindigkeit von UDP zu kombinieren, um schnell genug zu sein, um moderne Echtzeitspiele wie Ego-Shooter zu unterstützen. Es handelt sich im Grunde um eine Erweiterung für UDP.
Das Schlimme an TCP ist, dass, sobald ein Paket verworfen wird, alle anderen Pakete nicht mehr gesendet werden, bis das fehlende Paket zugestellt wird. Dies kann bei zeitkritischen Spielen ein großes Problem darstellen, da es bei Geräten nicht selten zu Paketverlusten kommt. Daher ermöglicht RMNP UDP, um eine schnelle Lieferung ohne Einschränkungen zu gewährleisten. Da UDP zustandslos ist, implementiert RMNP eine einfache Möglichkeit, Verbindungen zu handhaben und zwischen „verbundenen“ Clients zu unterscheiden. Jedes Paket enthält einen kleinen Header, der hauptsächlich einen CRC32-Hash enthält, um sicherzustellen, dass alle empfangenen Pakete korrekt übertragen wurden.
Um die Zuverlässigkeit zu gewährleisten, sendet der Empfänger Bestätigungspakete zurück, um dem Absender mitzuteilen, welche Pakete er empfangen hat. Der Absender sendet jedes Paket erneut, bis er eine Bestätigung erhält oder das maximale Timeout erreicht ist. Aus diesem Grund ist RMNP nicht 100 % zuverlässig, aber es kann davon ausgegangen werden, dass ein Paket zugestellt wird, es sei denn, ein Client hat für ein paar Sekunden einen Paketverlust von etwa 100 %.
go get github.com/obsilp/rmnp
Beispiel eines Pong-Servers
package main
import "github.com/obsilp/rmnp"
func main () {
server := rmnp . NewServer ( ":10001" )
server . Start () // non-blocking
// other code ...
}
Beispiel eines Ping-Clients
package main
import "github.com/obsilp/rmnp"
func main () {
client := rmnp . NewClient ( "127.0.0.1:10001" )
client . Connect () // non-blocking
// other code ...
}
Ereignisse und empfangene Pakete können durch das Setzen von Rückrufen empfangen werden. Weitere Informationen finden Sie in den jeweiligen Kursen.
Kundenrückrufe | Serverrückrufe
Dieses Projekt ist unter der MIT-Lizenz lizenziert – Einzelheiten finden Sie in der LIZENZ-Datei