Programiranje

Nasvet Java 18: Implementacija funkcije časovne omejitve za JDK 1.0.2 DatagramSocket

Če ste razvili aplikacijo Java, ki za pošiljanje in prejemanje sporočil uporablja vtičnico Datagram, ste morda naleteli na potrebo po uporabi funkcije časovne omejitve za odblokiranje DatagramSocket metoda prejema. Brez funkcije časovne omejitve bi vaša aplikacija blokirala, dokler ne bo prejela sporočila, in ker dostava Datagrama ni zagotovljena, bi lahko vaš program blokiral res dolgo. Ta namig Java bo opisal tehniko za določanje časovne omejitve in odblokiranje DatagramSocket metoda prejema.

Verjetno ste že uganili, da bo ta tehnika uporabila niti. Programiranje niti v Javi je zelo prijetno. Lahko bi ga primerjali z radostmi smučanja ob jezeru Tahoe ali jadranja ob obali Santa Cruza. (OK, mogoče ni to prijetno, vendar je vseeno zelo zabavno!)

Pri razmišljanju o metodi za izvedbo funkcije časovne omejitve je morda prva in najbolj očitna shema, ki mi pride na misel, namestitev funkcije prejema DatagramSocket v ločeno nit in nato zagon še ene niti kot časovnika, ki bi po poteku ubil sprejem nit, če je še živa. Čeprav bo ta metoda delovala, verjetno ni najbolj graciozen način za izvedbo naloge.

Namesto da bi ubil nit, ki je blokirana pri metodi sprejemanja, sem želel bolj elegantno rešitev - takšno, ki bi odblokirala metodo sprejemanja. Da bi to dosegel, sem potreboval nit, ki je bila sposobna poslati sporočilo datagrama prejemni niti, da je odblokirala prejemno nit po preteku časovne omejitve. Nit časovne omejitve je implementiran kot lasten razred, prejemna nit pa ustvari primerek razreda časovne omejitve tik pred blokiranjem metode sprejema. Naslednja koda prikazuje izvajanje razreda časovne omejitve. Upoštevajte, da je zaradi kratkosti ravnanje z izjemami izpuščeno.

uvoz java.io. *; uvoz java.net. *; uvoz java.lang. *; javni razred DatagramWatchdogTimer izvaja Runnable {DatagramWatchdogTimer (int timeoutSeconds) meče SocketException {timeout = timeoutSeconds; socket = nov DatagramSocket (); datagramPort = socket.getLocalPort (); Thread thisThread = nova nit (to); thisThread.start (); } public int getPort () {return datagramPort; } public void run () {// ustvari standardno odgovorno sporočilo, ki označuje // sporočilo je prišlo iz DatagramWatchdogTimer // v mojem primeru zadošča nič. String replyStr = novo celo število (0) .toString (); bajt [] replyBuf = nov bajt [replyStr.length ()]; replyStr.getBytes (0, replyStr.length (), replyBuff, 0); int replyLength = replyStr.length (); // prejmemo sporočilo iz prejemne niti. // to je potrebno, da vemo, kako poslati sporočilo o odblokiranju // nazaj. bajt [] vmesni pomnilnik = novo napajanje [128]; Paket DatagramPacket = nov DatagramPacket (medpomnilnik, buffer.length); socket.receive (paket); // počakajte s časom zakasnitve in nato pošljite // sporočilo za odblokiranje // nazaj. Thread.sleep (timeout * 1000); int requeststorPort = packet.getPort (); InetAddress requeststorAddress = packet.getAddress (); DatagramPacket sendPacket = nov DatagramPacket (replyBuff, replyLength, requeststorAddress, requeststorPort); DatagramSocket sendSocket = nov DatagramSocket (); sendSocket.send (sendPacket); } zakasnitev zasebnega int; zasebni int datagramPort; zasebna vtičnica DatagramSocket; } 

Kot smo že omenili, lahko kadar koli vaša aplikacija prejme sporočilo datagrama, lahko ustvari primerek datoteke DatagramWatchdogTimer nastavite časovno omejitev. Če aplikacija v nekaj sekundah s časovno omejitvijo ne prejme pravega sporočila, se bo odblokirala tako, da bo prejela sporočilo o odblokiranju iz DatagramWatchdogTimer razred.

Tu je primer:

// koda aplikacije int timeoutSeconds = 5; InetAddress myAddress = InetAddress.getByName (""); // ustvarimo primerek časovnega razreda DatagramWatchdogTimer wdTimer = nov DatagramWatchdogTimer (timeoutSeconds); int wdPort = wdTimer.getPort (); // pošljemo sporočilo na wdTimer za začetek merilnika časa // msgBuff je lahko karkoli želite. String msgString = new String ("čas me"); bajt [] msgBuff = nov bajt [msgString.length ()]; msgString.getBytes (0, msgString.length (), msgBuff, 0); DatagramSocket vtičnica = nova DatagramSocket (); DatagramPacket wdPacket = nov DatagramPacket (msgBuff, msgLength, myAddress, wdPort); socket.send (wdPacket); // zdaj lahko berete iz vtičnice in imate nekaj zagotovila //, da boste blokirali le za timeoutSeconds. bajt [] medpomnilnik = nov bajt [1024]; Paket DatagramPacket = nov DatagramPacket (medpomnilnik, buffer.length); socket.receive (paket); if (myAddress.equals (packet.getAddress) == true) {// prejeto sporočilo od predmeta časovnika} else {// prejeto pravo sporočilo} 

Ko uporabljate to tehniko, uporabite isti DatagramSocket tako za pošiljanje v objekt DatagramWatchdogTimer kot za sprejemanje datagramov. To zagotavlja, da objekt DatagramWatchdogTimer ve, kam poslati sporočilo o odblokiranju. Tudi v vzorčni kodi, prikazani zgoraj, so bila dinamično dodeljena vrata uporabljena z instanciranjem DatagramSocket () brez kakršnih koli argumentov. Deloval bi tudi z dobro znanimi vrati po vaši izbiri, kot je DatagramSocket (8000). Nazadnje boste morda želeli, da predmet časovnika pošlje več sporočil za odblokiranje - samo zato, da poveča možnosti, da ga aplikacija prejme. To ne bi smelo predstavljati težav, saj se predmet časovnika izvaja kot nit na isti napravi kot aplikacija.

Albert Lopez je bil član tehničnega osebja v podjetju Sun Microsystems od leta 1989 do leta 1995. Pred kratkim se je pridružil uslužbencem informacijskih sistemov pri čikaškem odboru za trgovino, kjer je vodilni član razvojne skupine za Javo, ki razvija naslednjo generacijo. sistem elektronskega trgovanja z uporabo Jave.

To zgodbo, "Java Nasvet 18: Izvajanje funkcije časovne omejitve za JDK 1.0.2 DatagramSocket" je prvotno objavil JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found