_ 2.2.3 Datagram sockets och IP-telefoni Denna uppgift belyser hur man använder Java Sound och UDP för att spela in och upp ljud i Internetbaserade program. Vi ska titta på hur man kan göra en IP-telefon. __ Uppgift Gör en program som sänder och tar emot ljud kontinuerligt, det vill säga en IP-telefon. Några möjliga utvidgningar: - Telefonnummer: En användare känner sällan till sin egen IP-adress och man kan underlätta för användarna genom att de kan ringa till varandra enbart genom att ange motpartens epostadress. Programmet kan då via epost och sända den egna IP-adressen till motparten och när motparten svarar med sin IP-adress via epost så kan kommunikationen börja. - Telefonkatalog: Man kan ha en telefonkatalog med sina vänner och i den kan man se direkt vilka som är online och då bara klicka på deras telefonnummer för att ringa upp. - Telefonen på: Om programmet alltid startas upp när användaren loggar in så kan någon ringa upp användaren "när som helst". - Telefonsvarare: Programmet kan känna av om nya ebrev kommer in under samtalets gång och upplysa användaren att en viss person försöker komma fram. Användaren kan då växla mellan samtalen eller koppla in den nya personen i samtalet. Man kan också tänka sig att man i ett sådant läge möts av en telefonsvarare, där man kan ge olika meddelanden skräddarsydda till olika epostadresser. __ Exempel Ett exempel på en kontinuerlig chattklient, det vill säga en IP-telefon, kan köras enligt följande (på två olika datorer): - På dator 1: -- Hämta filen: §[Phone.jar, 05_ass/ip1/2/2.2.3/Phone.jar]§ -- Kör programmet med: §java -jar Phone.jar§ - På dator 2: -- Hämta filen: §[Phone.jar, 05_ass/ip1/2/2.2.3/Phone.jar]§ -- Kör programmet med: §java -jar Phone.jar § Programmen kommunicerar direkt P2P, det vill säga inte via en server. __ Tips Vad händer när man sänder datagrampaket över Internet?: = Paket kan försvinna: -- 0-20% paketförlust är accepterbar (beroende på hur ljudet processas) -- 20-100% paketförlust är ej accepterbar = Paket fördröjs (olika tider): -- 0-150 millisekunder fördröjning märks inte -- 150-400 millisekunder fördröjning är accepterbar -- 400+ millisekunder fördröjning är ej accepterbar En bra IP-telefon försöker minimera dessa problem och grunden till många vanliga lösningar är: - Tillägg av ordningsnummer för varje paket - Tillägg av tidsstämpel för varje paket - Fördröjning av uppspelning (fixerad eller adaptiv) Genom att göra detta kan man se till att paketen spelas upp med rätt tidsintervall (och undviker "jitter", det vill säga att ljudet ibland spelas upp långsammare och ibland fortare) samt använda speciella metoder när ett paket saknas (exempelvis att spela upp tidigare paket igen eller interpolera mellan två paket). Man kan även använda speciella kodningsscheman hos både sändaren och mottagaren (antingen genom att inte utöka informationen som sänds (som vid en teknik kallad "interleaving") eller genom att öka informationen som sänds genom att lägga till redundant information (som vid en teknik kallad "forward error correction")). Notera dock att exempelprogrammet ovan inte använder några av dessa lösningar och är känsligt för paket som försvinner och/eller är fördröjda. Om man varierar storleken på datagrampaketen i detta program så får man: - Små datagrampaket: liten fördröjning med fler avbrott - Stora datagrampaket: större fördröjning med färre avbrott Detta kan alltså lösas med ett lite mer utvecklat program. Se vidare [Oracle: Java Sound Programmer's Guide, http://docs.oracle.com/javase/1.5.0/docs/guide/sound/programmer_guide/contents.html]. __ Hjälp ~ 05_ass/help/01.txt > [Klicka här för hjälp, helper.dsv@gmail.com, IP Stationär: 2.2.3 Datagram sockets och IP-telefoni: http://people.dsv.su.se/~pierre/i/i.cgi?href=05_ass/ip1/2.2.3.txt] ½===system_tutoring_message===½ < ~ 05_ass/help/02.txt