# P2P Voice chat



## Halfbax (3. Februar 2015)

Guten Tag,

ich möchte im kleinen Stil eine p2p Voice Übertragung als Großprojekt anlegen, da mir aber die Ansätze fehlen möchte ich einmal nachfragen, wie ich das ganze theoretisch hinkriege.

Vorrangig ist einmal die Sprachübertragung, dannach folgt die Textübertragung. Das reine UI habe ich bereits angelegt und sieht wie folgt aus.

(Link folgt)

Danke für die Hilfe 

LG


----------



## Improof (9. Februar 2015)

Hi Halfbax,

zunächst mal musst du die Verbindung zwischen den beiden Gesprächspartnern sicherstellen.

Hier musst du allerdings schon aufpassen:
Bei einem Text-basierten Gespräch kannst du TCP-Sockets verwenden. TCP stellt eine "sichere" Verbindung her, wobei "sicher" in diesem Fall heißt, dass z.B. verlorene Datenpakete nochmals angefordert werden.

Bei einem Sprachchat kann das aber schon Probleme in Form von großen Latenzen verursachen, wenn die Verbindung nicht sehr gut ist. Deshalb würde ich hier UDP als Protokoll verwenden. Die Kommunikation kannst du dir wie eine Art Stream vorstellen: Die Datenpakete werden vom Sender an den Empfänger geschickt, ganz egal ob dieser etwas erhält oder nicht. Das verursacht dann "nur" ein Knacken bzw. abgehacktes Gespräch, wenn die Verbindung eine kurze Unterbrechung hat.

In Java wird das so realisiert, dass du für TCP die Socket-Klasse verwendest und bei UDP die DatagramSocket-Klasse. Auf Google findest du hierzu mehr.

Da du aber ja trotzdem einen feste Verbindung zwischen den Gesprächspartnern und später auch Textübertragung willst, wirst du wohl so oder so TCP und UDP Kommunikation implementieren müssen. So kannst du zuerst über TCP und einen bestimmten Port eine Verbindung aufbauen, wenn diese steht müssen die beiden Programme aushandeln, über welchen Port sie die UDP-Kommunikation laufen lassen (z.B. könnten beide Seiten einen Port an die jeweils andere Seite schicken). Die IP bleibt ja die gleiche.

Das einzige Problem, dass ich hierbei sehe ist, dass der Port / die Ports (je nach Implementierung) in den Routern beider Seiten freigeschaltet - also Portweiterleitungen angelegt -werden müssen. Das könntest du auch nur lösen, wenn du einen Server dazwischen schaltest.


Bei der Sprachübertragung musst du nun genauso vorgehen, wie wenn du Text oder irgendwelche anderen Daten Übertragen willst:
Als erstes brauchst du die Daten. Google mal nach "Java microphone record" oder ähnliches, da gibts ganz brauchbare Ansätze. Die Daten, also die einzelnen Bytes, kannst du dann über deine Sockets übertragen und beim Empfänger durch die Lautsprecher wieder ausgeben (auch hier wieder: Google ist dein Freund ).


Ich hoffe, ich konnte dir einen ersten guten Ansatz liefern 

Gruß
Daniel


----------



## Halfbax (17. Februar 2015)

Guten Abend Improof,

ich war leider in den letzten 9 Tagen nicht erreichbar, aufgrund von Karneval und ähnliches.

Nun gut, du hast mir bereits sehr gute, viele und dementsprechend ausreichende Informationen geliefert 
Ich werde dies nun als mein Projektziel setzen! Ich stelle mir grad im theoretischen Teil noch die Frage in welchen Format die Daten (Mikrofon) über UDP versendet werden. 

Mit freundlichen Grüßen
Halfbax


----------



## Improof (19. Februar 2015)

Hi Halfbax,



Halfbax hat gesagt.:


> Ich stelle mir grad im theoretischen Teil noch die Frage in welchen Format die Daten (Mikrofon) über UDP versendet werden.


Die Daten hast du als Java in Form eines byte-Arrays vorliegen. Dieses kannst du einfach versenden und die Bytes dann beim Empfänger ausgeben. Wenn du das ganze noch abhörsicher machen willst, kannst du das ganze Array ja noch durch einen Verschlüsselungsalgorithmus jagen, musst dann halt nur aufpassen, dass die Daten zuverlässig entschlüsselt werden und das es nicht zu lange dauert wegen Latenzen.

Gruß
Daniel


----------

