成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Applet間的通訊(1)--TricksoftheJavaProgrammingGurus(轉(zhuǎn))

Applet間的通訊(1)--Tricks of the Java Programming Gurus (轉(zhuǎn))[@more@]

Tricks
 of the
 Java Programming Gurus

by Glenn L. Vanderburg. et al.

1.Applet間的通訊


目錄

  • .NET/editor1/editor.htm#getAppletTheOfficialMechanism">getApplet: 官方機(jī)制
  • 靜態(tài)變量和方法
  • 網(wǎng)絡(luò)通訊
  • dbasedCommunication">基于線程的通訊
  • 總結(jié)

  考慮到你要完成的任務(wù),一個(gè)applet,甚至幾個(gè)獨(dú)立的applet,有時(shí)可能都不夠。還好,applet之間可以通訊,通過協(xié)作它們可以完成一些更復(fù)雜的任務(wù)。一組協(xié)作的applet所能產(chǎn)生的效能使單個(gè)applet所不能媲美的。

  Applet之間的通訊可以通過傳統(tǒng)方法實(shí)現(xiàn):applet可以互相調(diào)用對(duì)方的成員方法或者通過socket或數(shù)據(jù)流通訊。事實(shí)上,applet間互相查找的途徑有很多,每一種方法都有自身的優(yōu)缺點(diǎn)。本文將討論四種通訊機(jī)制,并給出一個(gè)較為復(fù)雜的例子,在這個(gè)例子中我們將使用其中一種通訊機(jī)制。

getApplet: “官方”機(jī)制

  Java api 本身就有用來支持applet程序間協(xié)作的特性:AppletContext 類的 getAppletgetApplets 方法。設(shè)有這兩個(gè)函數(shù),applet程序可以通過名稱查找并訪問對(duì)方。你可以這樣調(diào)用 getApplet

Applet friend = getAppletContext().getApplet("Friend");

  一旦調(diào)用結(jié)束,變量 friend 就成了名為"Friend"的applet的一個(gè)實(shí)例(instance) (如果這樣的一個(gè)"Friend"applet存在的話)。例如:如果 "Friend" 是 Sun的 Animator applet 的一個(gè)實(shí)例,friend 將包含對(duì)這個(gè)實(shí)例的一個(gè)參考(reference)。

  Applet的名字是在HTML中指定的,而不是在Java代碼中。為了創(chuàng)建一個(gè)能被前面的實(shí)例代碼所發(fā)現(xiàn)的animator applet,你可以在HTML插入如下幾行:


<!-- applet parameters go here -->

  getApplets 方法和 getApplet 差不多,只不過getApplets返回一個(gè)Enumeration,其中列舉了所有可以進(jìn)行訪問的applet。然后我們就可以根據(jù)applet的不同屬性來查詢一個(gè)applet,包括applet的名字。下面示范了如何用getApplets查找一個(gè)名為"Friend" 的applet:

Applet friend;
for( Enumeration e = getAppletContext().getApplets();e.hasMoreElements(); ){
 try {
 Applet t = (Applet) e.nextElement();
 if ("Friend".equals(t.getParameter("name"))) {
 friend = t;
 break;
 }
 }
 catch (ClassCastException e) {
 }
}

  顯然,上述方法的工作很多,你不會(huì)用這種途徑去查找一個(gè)applet。然而,如果你要查詢多個(gè)applet,或是你不知道你所要查找的applet的確切的名字,這將是一種行之有效的方法。舉個(gè)例子來說,用getApplets查找所有以"Helper­"開頭命名的applet將會(huì)很容易,你的applet就可以和同一頁(yè)面中的所有的helper applet通訊了。

  不幸的是,這種官方推薦的applet通訊機(jī)制至少有兩大問題。首先,這種機(jī)制目前并沒有被具體化,因此不同的應(yīng)用程序?qū)υ摍C(jī)制有不同的實(shí)現(xiàn)。例如,getApplets 返回的是可以訪問的applet,但是什么是可以訪問?沒有明確的定義。你可能得到的是同一頁(yè)面上的applet,從同一個(gè)站點(diǎn)加載的applet,或者是兩者的交集,這些都取決于運(yùn)行applet的瀏覽器。這些問題因該促使Sun和Java's licensees制定出一個(gè)更加嚴(yán)密的,明確定義的applet協(xié)作機(jī)制。不過目前為止,這種applet通訊及值的不一致實(shí)現(xiàn)仍然是個(gè)令人頭痛的問題。

  另外一個(gè)問題就沒有這么簡(jiǎn)單了。它看起來很容易理解,但它會(huì)使事情復(fù)雜到令很多applet程序員吃驚的地步。問題出在 getAppletgetApplets 不會(huì)讓你得到一個(gè)還沒有完全加載并初始化了的applet。由于網(wǎng)絡(luò)的不確定和其他因素,例如applet的大小,我們不能決定頁(yè)面上哪一個(gè)applet首先被加載,哪一個(gè)最后被加載。這就意味著我們?cè)瓉淼挠?jì)劃:首先啟動(dòng)并控制一個(gè)applet,查找其他applet,然后同它們協(xié)作,如果不增加額外的處理的話,是不能夠達(dá)到預(yù)期目的的。

  當(dāng)然了,解決上述問題有很多方法??刂芶pplet可以檢查它的協(xié)作伙伴,如果它們還沒有就緒,就進(jìn)入等待睡眠(一秒鐘左右),然后再次協(xié)作applet的狀態(tài),直到所有協(xié)作成員都已被初始化過。雖然這種方法效率很低,會(huì)導(dǎo)致較長(zhǎng)的啟動(dòng)時(shí)間,怎么說它還是有效的。一個(gè)更好的解決方法是“雙向查找、提醒機(jī)制”(two-way search-and-notification mechanism),當(dāng)一個(gè)applet初始化完成后,控制這個(gè)applet查找其他applet并通知它們“我準(zhǔn)備好了”。使用這種機(jī)制,所有輔助applet(helpers initialize)初始化完成后,主控applet將能夠立即找到它們并開始協(xié)作,如果哪個(gè)輔助appplet遲一步完成初始化,主控applet也會(huì)被及時(shí)通知。

靜態(tài)變量和方法

  很多情況下,我們可以通過使用一個(gè)通用類的靜態(tài)成員變量和方法構(gòu)造一個(gè)內(nèi)部applet通訊機(jī)制。如果多個(gè)applet都依賴于這個(gè)通用類,它們就可以把這個(gè)類作為一個(gè)消息的匯集點(diǎn)(rendezvous point),在那里注冊(cè)它們的存在并察看其他applet的存在。

  這里有個(gè)例子。如果在一個(gè)頁(yè)面上ColorRelay applet被使用多次,不同的實(shí)例通過協(xié)作顯示不同的圖片(一些不同顏色的打字機(jī)色帶)。你可以想象這些applet依靠一個(gè)標(biāo)志位。如果一個(gè)applet顯示了彩色的圖片,其他的只能現(xiàn)實(shí)黑白的圖片。圖 1.1 是運(yùn)行時(shí)的截圖,清單 1.1 是 HTML 代碼。

圖 1.1 : ColorRelay applet 運(yùn)行中


創(chuàng)新互聯(lián)建站專注于昌邑企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站開發(fā)。昌邑網(wǎng)站建設(shè)公司,為昌邑等地區(qū)提供建站服務(wù)。全流程按需定制開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)


清單 1.1. ColorRelay.html.


Used Applets Sale!




msnet.tjg.ColorRelay.class"
width=50 height=50 name="first">




Low, low prices!


width=50 height=50>


This week only!


width=50 height=50>



We won't be undersold!


清單 1.2 展示了 ColorRelay applet的程序框架,具體方法用注釋代替了。我們將在后面的清單中提供完整的代碼。


清單 1.2. ColorRelay.java (part 1).
/*
* ColorRelay.java  1.0 96/04/14 Glenn Vanderburg
*/

package COM.MCP.Samsnet.tjg;

import java.applet.*;
import java.awt.*;
import java.awt.image.*;

/**
* An applet which coordinates with other instances of itself on a web
* page to alternately flash copies of an image in different colors.
*
* @version  1.0, 14 Mar 1996
* @author Glenn Vanderburg
*/

public class ColorRelay extends Applet implements Runnable
{
 // These are used to maintain the list of active instances
 static ColorRelay list, listTail;
 ColorRelay next, prev;

 // This thread switches between instances
 static Thread relayer;

 // This is the original, unmodified base image which all
 // of the instances use.
 static Image originalImage;

 // The color that this instance uses to flash. White is the default.
 Color flashColor = Color.white;

 // The modified, colorized image.
 Image modifiedImage;

 // The image currently being displayed. This reference
 // alternates between originalImage and modifiedImage.
 Image image;

 // We use a media tracker to help manage the images.
 MediaTracker tracker;

 // The time we wait while flashing. Two seconds is the default.
 int sleepSecs = 2;

 // Method: static synchronized
 // addToList(ColorRelay elem) Listing 1.3
 // Method: static synchronized
 // removeFromList(ColorRelay elem) Listing 1.3
 // Method: public init() Listing 1.4
 // Method: public start() Listing 1.5
 // Method: public stop() Listing 1.5
 // Method: public run()  Listing 1.5
 // Method: public getAppletInfo()  on CD
 // Method: public getParameterInfo () on CD
 // Method: public paint(Graphics g)  on CD
 // Method: public update(Graphics g) on CD
 // Method: flash() on CD
 // Method: parseRGB(String str) on CD
}

  正如你看到的那樣,程序中有一些普通的變量:兩個(gè)Iamge,一個(gè)Color,一個(gè)MediaTracker,一個(gè)時(shí)間值,還有兩個(gè)靜態(tài)方法用來將 ColorRelay 對(duì)象插入鏈表。此外還有四個(gè)靜態(tài)變量:originalImage, 當(dāng)applet沒有輪到發(fā)亮?xí)r顯示;一個(gè)線程對(duì)象,用來協(xié)調(diào)applet之間的活動(dòng),還有applet鏈表的首位節(jié)點(diǎn)。


未完,待續(xù)。

翻譯:chenyuan_tongji (Mailto:chenyuan_tongji@sian.com">chenyuan_tongji@sian.com)


網(wǎng)站題目:Applet間的通訊(1)--TricksoftheJavaProgrammingGurus(轉(zhuǎn))
本文路徑:http://jinyejixie.com/article48/pgejhp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站導(dǎo)航、電子商務(wù)、面包屑導(dǎo)航、品牌網(wǎng)站制作、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
庆元县| 肥乡县| 绍兴市| 太原市| 南澳县| 武威市| 双桥区| 吴忠市| 丹阳市| 丹阳市| 嘉善县| 松阳县| 清水河县| 平度市| 安庆市| 湖口县| 桦南县| 桦南县| 达日县| 揭西县| 霍州市| 庆城县| 彭泽县| 鲜城| 蒲江县| 株洲市| 呼和浩特市| 托里县| 济阳县| 伊宁市| 溧阳市| 德昌县| 滦南县| 东辽县| 大田县| 栖霞市| 开远市| 绥德县| 恭城| 阿合奇县| 长治市|