Multiplayer-Netzwerk

Für viele Anforderungen an die Multiplayer-Netzwerkkommunikation sollten die Network Discover-Protokolle von Android alles bieten, was Sie benötigen, und wie erwartet funktionieren. ChromeOS verfügt außerdem über eine integrierte Broadcast-Weiterleitung in beide Richtungen, damit Ihr Spiel Antworten auf Broadcast-Pakete, die an Peers im lokalen Netzwerk gesendet werden, und Broadcast-Pakete, die von anderen Peers im lokalen Netzwerk gesendet werden, korrekt empfängt.

Aufgrund der Architektur und der Sicherheitsregeln von ChromeOS muss für eine Android-App, die die IPv4-Adresse des ChromeOS-Geräts benötigt, auf dem sie ausgeführt wird, zusätzliche Logik implementiert werden. Das ist beispielsweise erforderlich, um die Adresse an einen Server zu senden, der ein Client-zu-Client-Mehrspielerspiel mit Nicht-ChromeOS-Clients im selben lokalen Netzwerk vermitteln möchte.

Die IPv4-Adresse des Netzwerks mit der höchsten Priorität, mit dem das ChromeOS-Gerät verbunden ist, finden Sie in der Android-Systemeigenschaft vendor.arc.net.ipv4.host_address und bei Bedarf in vendor.arc.net.ipv4.host_gateway. Eine Möglichkeit dazu ist:

fun getChromeOsIpAddress() : String {
   val process = ProcessBuilder().command("/system/bin/getprop", "vendor.arc.net.ipv4.host_address").start()
   val ipAddress = readInput(process.inputStream)
   return ipAddress
}

fun getChromeOsIpGateway() : String {
   val process = ProcessBuilder().command("/system/bin/getprop", "vendor.arc.net.ipv4.host_gateway").start()
   val gatewayAddress = readInput(process.inputStream)
   return gatewayAddress
}

fun readInput(inputStream: InputStream) : String {
   val bufferedReader = BufferedReader(InputStreamReader(inputStream))
   val stringBuilder = StringBuilder()

   var line: String? = null
   while (bufferedReader.readLine().also({ line = it}) != null) {
       stringBuilder.append(line).append('\n')
   }

   return stringBuilder.toString()
}

Traffic, der an diese IPv4-Adresse im lokalen Netzwerk gesendet wird, wird an die Android-App weitergeleitet, ohne dass zusätzliches NAT-„Hole Punching“ erforderlich ist. Weitere Informationen zu dieser IPv4-Problemumgehung finden Sie in diesem Chromium-Eintrag.

In IPv6-Netzwerken erhält Android eine eigene Netzwerkadresse, die von ChromeOS getrennt ist. Direkte Verbindungen im lokalen IPv6-Netzwerk zu und von dieser Adresse sollten so funktionieren, als wäre Android direkt mit dem lokalen IPv6-Netzwerk verbunden.