Programmēšana

Java 18. padoms: taimauta funkcijas ieviešana JDK 1.0.2 DatagramSocket

Ja esat izstrādājis Java lietojumprogrammu, kas izmanto Datagram ligzdu ziņojumu sūtīšanai un saņemšanai, iespējams, esat saskāries ar nepieciešamību ieviest taimauta funkciju, lai atbloķētu Datagrammas ligzda saņemt metodi. Bez noildzes funkcijas jūsu lietojumprogramma tiktu bloķēta, līdz tā saņems ziņojumu, un, tā kā Datagram piegāde netiek garantēta, jūsu lietojumprogramma var bloķēties patiešām ilgu laiku. Šajā Java padomā tiks aprakstīta tehnika, kā novirzīt un atbloķēt Datagrammas ligzda saņemt metodi.

Jūs droši vien jau uzminējāt, ka šī tehnika izmantos pavedienus. Vītņu programmēšana Java ir diezgan patīkama. Varētu to salīdzināt ar slēpošanas priekiem Taho ezerā vai burāšanu netālu no Santa Kruzas krasta. (Labi, varbūt tā nav to patīkami, bet tas joprojām ir ļoti jautri!)

Apsverot noildzes funkcijas izpildes metodi, iespējams, pirmā un acīmredzamākā shēma, kas nāk prātā, ir DatagramSocket saņemšanas funkcionalitātes ievietošana atsevišķā pavedienā un pēc tam vēl viena pavediena palaišana kā taimeris, kas pēc termiņa beigām nogalinātu saņemšanu diegu, ja tas vēl ir dzīvs. Kaut arī šī metode darbosies, iespējams, tas nav graciozākais veids, kā paveikt uzdevumu.

Tā vietā, lai nogalinātu pavedienu, kas ir bloķēts saņemšanas metodē, es gribēju graciozāku risinājumu - tādu, kas atbloķētu saņemšanas metodi. Lai to paveiktu, man vajadzēja pavedienu, kas spēja nosūtīt datagrammas ziņojumu uz saņemošo pavedienu, lai atbloķētu saņemošo pavedienu pēc noildzes perioda beigām. Taimauta pavediens tiek ieviests kā sava klase, un saņemošais pavediens izveido taimauta klases instanci tieši pirms bloķēšanas saņemšanas metodē. Šis kods parāda taimauta klases ieviešanu. Ņemiet vērā, ka īsuma dēļ izņēmumu apstrāde tiek izlaista.

importēt java.io. *; importēt java.net. *; importēt java.lang. *; publiskā klase DatagramWatchdogTimer īsteno Runnable {DatagramWatchdogTimer (int timeoutSeconds) met SocketException {timeout = timeoutSeconds; ligzda = new DatagramSocket (); datagramPort = socket.getLocalPort (); Thread thisThread = jauns pavediens (šis); thisThread.start (); } public int getPort () {return datagramPort; } public void run () {// izveido standarta atbildes ziņojumu, kas norāda, ka // ziņa nāca no DatagramWatchdogTimer // manā gadījumā pietiek ar nulli. Virknes atbildeStr = new Integer (0) .toString (); baits [] atbildeBuf = jauns baits [atbildeStr.length ()]; atbildeStr.getBytes (0, atbildeStr.length (), atbildesBuff, 0); int atbildes garums = atbildesStr.length (); // saņemt ziņojumu no saņēmēja pavediena. // tas ir nepieciešams, lai mēs zinātu, kā atbloķēšanas // ziņojumu tam nosūtīt atpakaļ. baits [] buferis = jauns bute [128]; DatagramPacket pakete = new DatagramPacket (buferis, buferis.length); ligzda.saņemt (pakete); // pagaidiet taimauta sekunžu skaitu un pēc tam nosūtiet atbloķējošu // ziņojumu. Thread.sleep (taimauts * 1000); int requestorPort = pakešu.getPort (); InetAddress requestorAddress = packet.getAddress (); DatagramPacket sendPacket = jauns DatagramPacket (answerBuff, answerLength, requestorAddress, requestorPort); DatagramSocket sendSocket = jauns DatagramSocket (); sendSocket.send (sendPacket); } privāts int noildze; private int datagramPort; privāta DatagramSocket ligzda; } 

Kā minēts iepriekš, ikreiz, kad jūsu lietojumprogrammai ir jāsaņem datagrammas ziņojums, tā var izveidot DatagramWatchdogTimer klasē, lai iestatītu taimauta periodu. Ja programma noildzes sekunžu laikā nesaņem īstu ziņojumu, tā tiks atbloķēta, saņemot atbloķēšanas ziņojumu no DatagramWatchdogTimer klasē.

Šeit ir piemērs:

// lietojumprogrammas kods int timeoutSeconds = 5; InetAddress myAddress = InetAddress.getByName (""); // izveidojiet taimera klases datagrammas eksemplāru DatagramWatchdogTimer wdTimer = new DatagramWatchdogTimer (timeoutSeconds); int wdPort = wdTimer.getPort (); // nosūtiet ziņojumu uz wdTimer, lai sāktu taimeri // msgBuff var būt viss, ko vēlaties. String msgString = jauna virkne ("laiks mani"); baits [] msgBuff = jauns baits [msgString.length ()]; msgString.getBytes (0, msgString.length (), msgBuff, 0); DatagramSocket ligzda = new DatagramSocket (); DatagramPacket wdPacket = jauns DatagramPacket (msgBuff, msgLength, myAddress, wdPort); socket.send (wdPacket); // tagad jūs varat lasīt no kontaktligzdas un iegūt zināmu pārliecību //, ka bloķēsit tikai timeoutSeconds. baits [] buferis = jauns baits [1024]; DatagramPacket pakete = new DatagramPacket (buferis, buferis.length); ligzda.saņemt (pakete); if (myAddress.equals (packet.getAddress) == true) {// saņēmis ziņojumu no taimera objekta} cits {// saņēmis īstu ziņojumu} 

Izmantojot šo paņēmienu, noteikti izmantojiet to pašu DatagramSocket gan nosūtīšanai uz objektu DatagramWatchdogTimer, gan datagrammu saņemšanai. Tas nodrošina, ka DatagramWatchdogTimer objekts zina, kur nosūtīt atbloķēšanas ziņojumu. Arī iepriekš parādītajā koda paraugā tika izmantots dinamiski piešķirts ports, bez jebkādiem argumentiem veicot DatagramSocket () saīsināšanu. Tas darbotos arī, izmantojot labi zināmu portu pēc jūsu izvēles, piemēram, DatagramSocket (8000). Visbeidzot, iespējams, vēlēsities, lai taimera objekts sūtītu vairāk nekā vienu atbloķētu ziņojumu - lai tikai palielinātu iespēju, ka programma to saņem. Tam nevajadzētu būt problēmai, jo taimera objekts darbojas kā pavediens tajā pašā mašīnā, kurā atrodas lietojumprogramma.

Alberts Lopess bija Sun Microsystems tehniskā personāla loceklis no 1989. līdz 1995. gadam. Nesen viņš ir pievienojies Informācijas sistēmu personālam Čikāgas Tirdzniecības padomē, kur viņš ir Java izstrādes komandas, kas izstrādā nākamās paaudzes attīstību, galvenais loceklis elektroniskā tirdzniecības sistēma, izmantojot Java.

Šo stāstu "Java Padoms 18: Taimauta funkcijas ieviešana JDK 1.0.2 DatagramSocket" sākotnēji publicēja JavaWorld.

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