1 / 51

《Java 程序设计之网络编程 》

《Java 程序设计之网络编程 》. 教学课件. 重庆大学计算机学院 电子邮件: lizhx@126.com.

helga
Download Presentation

《Java 程序设计之网络编程 》

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 《Java程序设计之网络编程》 教学课件 重庆大学计算机学院 电子邮件:lizhx@126.com

  2. Java应用程序可以分为三大类:Java Application、Java Applet以及Servlet。Java Application是可以独立运行的Java程序,我们在前面涉及的java程序大部分都是Java Application。相对于Java Application而言,Java Applet是不能独立运行,它只能嵌入到浏览器中运行。在HTML文件中,通过一个特定的HTML标签引用Java Applet程序,从而将Applet文件嵌入到网页文件中。当读者访问嵌有Applet的网页时,浏览器会自动从Web服务器上下载Applet程序,并在本机运行的Java虚拟机上运行。 第12章 Applet应用程序

  3. 主要内容: • 12.1 Applet程序设计基础 • 12.2 java.applet包 。 • 12.3 Applet中的多媒体应用 • 12.4 Applet中的鼠标和键盘事件

  4. 12.1 Applet程序设计基础 • 12.1.1加载Applet • Applet是Java语言的又一应用形式。它没有main方法,因而不能由解释器直接解释执行。 • 为了运行它,我们需要把它放进Web页面。当这个页面在浏览器上显示时,Applet就在页面中指定的一部分区域内显示其运行结果。

  5. 12.1.2 Applet的安全性限制 • Applet程序的执行需要从Internet上将Applet的伪代码下载到本地系统运行,因此Applet在给人们带来好处的同时,也带来了潜在的安全隐患。 • 为了防止这样的问题出现,在缺省的情况下,大多数浏览器在Applet安全方面受到诸多的限制,几乎不能对系统进行任何“读”或“写”的操作。

  6. 不允许Applet运行时执行另一程序。 • 不允许Applet访问本地文件系统。 • Applet不能执行任何本地计算机上的程序。 • 不允许Applet尝试打开除提供Applet的服务器之外的任何系统的Socket。 • 不允许Applet访问用户名、电子邮件地址等与本地系统有关的信息。 • 对于Applet而言,Java环境中的某些标准系统属性是只读的。

  7. Applet不能创建或装载Applet的机器的网络连接。 • Applet不能充当网络服务器,监听或接收来自远程系统的连接请求。 • 不允许Applet装载动态库或定义本地方法调用。 • Applet不能操纵不在自己线程组中的任何线程。 • Applet不能关闭JVM。

  8. 12.1.3 Applet的生命周期 • Applet由运行时系统来构造。当它所在的页面被浏览器装入后,Applet就出生了。 • 这时系统自动调用init()方法,进行一些必要的初始化工作。 • 接着,系统将调用start()方法启动Applet的执行。 • 当浏览器切换到别的页面时,stop()被调用,以终止Applet的执行。

  9. 假如浏览器又切换回Applet所在页面,那么运行时系统将从调用start()方法开始Applet的又一次运行。假如浏览器又切换回Applet所在页面,那么运行时系统将从调用start()方法开始Applet的又一次运行。 • 当浏览器关掉时,Applet走到了它一生的终点。 • 系统将先调用stop()停止它的执行,然后用destroy( )方法来完成资源回收等收尾工作。 • 如果浏览器重载页面,就会先令Applet死亡(依次调用stop()和destroy()),然后装入页面(调用init()),开始Applet的又一次生命。

  10. 1.init() • 当applet被加载时,会首先执行init方法,该方法相当于Application程序中的main,该方法只能被执行一次。Applet可用这个方法来初始化数据的值,比如设置全局变量,初始化对象等等。该方法只在Applet首次装入时被调用,并且在调用start()之前执行完成。

  11. 2.start() • init方法执行完毕会就会自动执行start方法,start方法可以被反复执行,如一个applet被stop后,可以使用start方法重新开动。该方法的执行使得Applet成为“活动”的。无论Applet何时成为可见的,它同样要执行一次,如:当浏览器在被图标化后又恢复时,或者当浏览器在链接到另一个URL后又返回含有这个Applet的页面时。

  12. 3.stop() • stop方法是在Applet成为不可见时被调用。该方法在当用户不注意Applet的时候,停止一些资源的工作以免影响系统运行效率。比如:在浏览器被图标化或链接到另一个URL时,Applet会调用该方法使动画停止。

  13. 4.Destroy() • 当关闭包含Applet的浏览器窗口时,会调用该方法,以销毁Applet对象,释放对象占用的资源。

  14. 12.2 java.applet包 • 12.2.1 Applet类的继承关系 • Java.applet.Applet类实际上是java.awt.Panel的子类。

  15. 这种层次关系显示,一个Applet可直接用作一个AWT布局的起始点。因为Applet是Panel的子类,所以它有一个缺省的流(flow)布局管理器。这种层次关系显示,一个Applet可直接用作一个AWT布局的起始点。因为Applet是Panel的子类,所以它有一个缺省的流(flow)布局管理器。 • Component,Container和Panel类的方法被Applet类继承了下来。而与Panel不同的是,Applet类是一个可以运行的类,创建一个Applet类就相当于创建一个Applet应用程序。

  16. 12.2.2 Applet类的方法 1.有关运行环境和Applet状态的方法 • public AppletContext getAppletContext():用以得到与Applet有关的上下文(AppletContext)对象。此方法与访问Applet的执行环境有关。 • public void resize(int width,int height):重新设置Applet所在区域的大小。该方法重写了Component类的resize()方法。它还有一个重载方法。 • public void showStatus(String msg):用Applet的上下文(如执行它的浏览器)来显示Applet的状态信息。

  17. public final void setStub(Applet Stub):用来设置与Applet相关的“存根”AppletStub。除非你要构造自己的Applet浏览器,否则不要使用它。由final修饰符可知这个方法是不可重写的。 • public Locale getLocale():Local是java.util包中的一个类,封装与国家、语言等相等的地域信息。这个方法用于获取与Appet相关的Locale对象。 • public boolean isActive():判断Applet是否处于被激活的状态。

  18. 2.用于操作声音、图像资源的方法 • public Image getImage(URL url):从给定的URL获取Image对象,用以处理图像。 • public Image getImage(URL url,String name) 获取指定URL和名字的Image对象。 • public AudioClip getAudioClip(URL url):从给定的URL获取AudioClip对象。

  19. public AudioClip getAudioClip(URL url,String name):获取指定URL和名字的AudioClip对象,这两个方法用以处理声音。 • public void play(URL url):用于演奏指定URL的AudioClip对象。 • public void play(URL url,String name):用于演奏指定URL和名称的AudioClip对象。

  20. 3.与生命周期有关的方法 • public void init():做初始化工作,在Applet被装入时调用。 • public void start():启动Applet的运行。 • public void stop():停止Applet运行时被自动调用。 • public void destroy():当Applet消亡时被自动调用,一般用来做回收资源等收尾工作。

  21. 4.与Applet所在页面有关的方法 • public URL getCodeBase():返回Applet所在的文档的URL。 • public URL getDocumentBase():返回Applet所在的HTML文档的URL。 • public String getAppletInfo():返回一个String对象,其中包含Applet的版。本,拷贝权、作者等信息。 • public String[][] getParameterInfo():描述Applet参数的名字、类型和描述 • public String getParameter(String):得到在HTML文档中传给Applet的参数。

  22. 12.2.4 HTML和Applet <applet [archive= archiveList] code= appletFile. class width= pixels height= pixels [codebase= codebaseURL ] [alt= alternateText ] [nam e= appletInstanceName ] [alig n= alignment ] [vspace = pixels ] [hspace= pixels ] > [<param name= appletAttribute1 value= value >] [<param name= appletAttribute2 value= value >] …… [alternateHTML] </applet>

  23. archive = archiveList • code = appletFile.class • width = pixels height = pixels • codebase = codebaseURL • alt = alternateText • name = appletInstanceName • align = alignment • vspace = pixels hspace = pixels • <param name = appletAttribute1 value = value>

  24. 【例12-1】HelloWord程序 HTML源文件: <HTML> <applet code="helloworld.class" width=400 height=150 codebase=”./applet”> <param name=size value=40> <param name=color value=008800> </APPLET> </HTML>

  25. Applet源程序 import java.awt.*; import java.applet.*; public class helloworld extends Applet { private String title; private int size; private int color; public void init() { title="Hello World!"; size=Integer.parseInt(getParameter("size")); //获得字体大小 color=Integer.parseInt(getParameter("color")); //获得字体颜色 } public void paint(Graphics g) { Color c=new Color(color); g.setColor(c); Font f=new Font("",1,size); g.setFont(f); g.drawString(title,100,80); } }

  26. 12.2.4 Appletviewer • 为了简化和加速开发过程,JDK附带了一个专为查看Applet而设计但不支持HTML页面查看的工具。这个工具就是Appletviewer,它使你不必使用Web浏览器即可运行Applet的一个Java应用程序。

  27. 12.2.5 Applet的显示 • 除了基本的生命周期外,Applet还有与其显示有关的一些重要的方法,包括:paint()、repaint()和update()方法。这些方法是Applet显示和刷新的重要工具,它们的声明和文档在AWT组件类中。Applet的更新显示都是由AWT线程来独立控制完成。

  28. 12.3 Applet中的多媒体应用 • 12.3.1URL • URL(Uniform Resoure Locator:统一资源定位器)是Internet上各种资源的定位地址。在Java语言中URL类封装了多个URL,一般有两种方法创建一个URL对象: • URL u=new URL(“http://java.sun.com/index.html”); • URL data=new URL(u,”data/planets.dat”);

  29. 第一种方法向URL构造器传递一个字符串,且指定了整个资源的名称,因此称为绝对URL。第二种方法可以产生相对URL,它指定的planets.dat文件位于URL对象u的data子目录中。第一种方法向URL构造器传递一个字符串,且指定了整个资源的名称,因此称为绝对URL。第二种方法可以产生相对URL,它指定的planets.dat文件位于URL对象u的data子目录中。 • 在Applet类中有两个方法可以获得对象的URL: • public URL getCodeBase():返回Applet所在的文档的URL。 • public URL getDocumentBase():返回Applet所在的HTML文档的URL。

  30. 12.3.2加载图像 • Applet类中,加载图像文件的方法有两个: • public Image getImage(URL url):从给定的URL获取Image对象,用以处理图像。 • public Image getImage(URL url, String name) 获取指定URL和名字的Image对象。

  31. Graphics类中显示图像文件的方法也有两个: • drawImage(Image img, int x, int y, ImageObserver obs):在指定的位置显示图像对象img。 • drawImage(Image img, int x, int y, int width, int height, ImageObserver obs):将图像对象img缩小或放大到指定大小,并在指定位置显示图像。

  32. 【例12-2】加载并显示图像 Applet源程序 import java.awt.*; import java.applet.*; public class display_image extends Applet { Image labmag; public void init() { labmag=getImage(getDocumentBase(),"image.jpg"); } public void paint(Graphics g) { g.drawImage (labmag,0,0,this); g.drawImage (labmag,0,150,200,100,this); } }

  33. HTML源程序 • <HTML> • <applet code= display_image.class width=600 height=250 > • </applet> • </HTML>

  34. 12.3.3播放声音 • 播放一段声音文件的最简单的方式是通过Applet的play方法: • public void play(URL url):用于演奏指定URL的AudioClip对象。 • public void play(URL url,String name):用于演奏指定URL和名称的AudioClip对象。

  35. 【例12-3】用play方法播放声音文件 import java.awt.Graphics; import java.applet.Applet; public class play_audio extends Applet { public void paint(Graphics g) { g.drawString("Audio Test", 25, 25); play(getDocumentBase(),"audio.wav"); } }

  36. AudioClip类 • 1)装入一段Audio Clip • 要转载一个声音文件,必须先通过指定的声音文件生成一个AudioClip对象。在Applet中有两种方法可以获取声音文件并生成一个AudioClip对象: • public AudioClip getAudioClip(URL url):从给定的URL获取AudioClip对象。 • public AudioClip getAudioClip(URL url,String name):获取指定URL和名字的AudioClip对象,这两个方法用以处理声音。

  37. 2)播放AudioClip对象 • 一旦一段clip被装载,可选择与之相关的三个方法之一:play,loop,或stop • play():将已装入的AudioClip对象播放一遍。 • loop():启动AudioClip对象的播放并不断循环(自动重放)。 • stop()

  38. 【例12-4】循环播放声音 import java.awt.Graphics; import java.applet.*; public class loop_audio extends Applet { AudioClip sound; public void init() {sound = getAudioClip(getDocumentBase(), "audio.wav"); } public void paint(Graphics g) { g.drawString("Loop Audio Test", 25, 25); } public void start() { sound.loop(); } public void stop() { sound.stop(); } }

  39. 12.5 Applet编程实例【例12-8】一个通过Applet显示时钟的例子 import java.awt.*; import java.applet.*; import java.util.Date; //这是Java中的低级实用工具包,可以处理时间等内容。 public class display_clock extends Applet implements Runnable //有线程运行接口 { Date timenow; //Date是一个时间定义与创建函数. Clock myClock; //用户自定义的类 Thread clockthread=null; //设置一个线程 public void start() //线程开始的类 {if (clockthread==null) //如果线程为空,则 {clockthread=new Thread (this); //开始新的线程 clockthread.start(); //开始}}

  40. public void stop() //终止线程 { clockthread.stop(); //终止线程,使它 clockthread=null; //为空}  public void run() //运行线程 {while(true) //一个死循环,条件永远都是真的。 {repaint(); //重新绘制界面 try{Thread.sleep(1000);} //让线程沉睡1000毫秒,也就是一秒钟 catch(InterruptedException e){} //捕获异常(也就是错误)}}   public void paint(Graphics g) { timenow=new Date(); //新的时间的获得 //获得小时,分钟,秒钟 myClock=new Clock(timenow.getHours (), timenow.getMinutes (), timenow.getSeconds ()); g.drawString(timenow.toString(),25,240);//将它打印出来! myClock.show(g,100,100,100); //使面板显示} }

  41. class Clock //用户自定义的类开始,编译后,它单独成为一个CLASS文件 {Clock(int hrs,int min,int sec) //类函数入口 { hour=hrs%12; //将原始数据处理,得到小时 minute=min; //将原始数据处理,得到分钟 second=sec; //将原始数据处理,得到小时} void show(Graphics g,int cx,int cy,int rad) //重新定义SHOW函数 {int hrs_len=(int)(rad*0.5), //时针的长度 min_len=(int)(rad*0.6), //分钟的长度 sec_len=(int)(rad*0.9); //秒钟的长度 double theta; //画出钟面 g.drawOval(cx-rad,cy-rad,rad*2,rad*2);//画出时针 theta=(double)(hour*60*60+minute*60+second)/43200.0*2.0*Math.PI ; drawNiddle(g,Color.blue,cx,cy,hrs_len,theta); //画出分针 theta=(double)(minute*60+second)/3600.0*2.0*Math.PI ; drawNiddle(g,Color.red,cx,cy,sec_len,theta); //画出秒针 theta=(double)(second)/60.0*2.0*Math.PI ; drawNiddle(g,Color.green ,cx,cy,sec_len,theta);}

  42. private void drawNiddle(Graphics g,Color c,int x,int y,int len,double theta) { int ex=(int)(x+len*Math.sin(theta)); int ey=(int)(y-len*Math.cos(theta)); g.setColor (c); g.drawLine(x,y,ex,ey); } int hour,minute,second;}}

  43. 【例12-9】使用Applet和Graphics,实现一个文字的移动广告【例12-9】使用Applet和Graphics,实现一个文字的移动广告 import java.awt.*; import java.applet.*; public class ShadowText extends Applet implements Runnable { private Image img; private Image offI; private Graphics offG; private Thread thread = null;  private int height,width; private String text; private int FontSize; private Font font; private int textcolor, backcolor, shadowcolor;

  44. public void init() { width = this.size().width; height = this.size().height; //获取显示信息 String s = new String(getParameter("Text"));   text = new String("Hello"); if(s != null) text = s; //获取字体大小 FontSize = 30; s = new String(getParameter("FontSize")); if(s != null) FontSize = Integer.parseInt(s); //获得字体颜色 s = getParameter("Fore"); textcolor = (s==null) ? 0x000000 : Integer.parseInt(s, 16); //获取背景颜色 s = getParameter("Back"); backcolor = (s==null) ? 0x000000 : Integer.parseInt(s, 16); //获取阴影颜色 s = getParameter("shadow"); shadowcolor = (s==null) ? 0x000000 : Integer.parseInt(s, 16); //设置背景颜色 this.setBackground(new Color(backcolor)); //使用Graphics创建一张图片 img = createImage(width+300,height); Graphics temp = img.getGraphics(); temp.setColor(new Color(backcolor));

  45. temp.fillRect(0,0,width,height); temp.setColor(new Color(shadowcolor)); font = new Font("TimesRoman",Font.BOLD,FontSize); temp.setFont(font); temp.drawString(text,10,height*3/4); temp.setColor(new Color(textcolor)); temp.drawString(text,10-3,height*3/4 - 3);//构造可控制的图片对象 offI = createImage(width,height); offG = offI.getGraphics(); } //重载start()方法,启动线程 public void start() { if(thread == null) { thread = new Thread(this); thread.start(); } } //绘制屏幕的线程体 public void run() { int x=width; while(thread != null) { try { offG.drawImage(img,x,0,this); repaint(); thread.sleep(20); }

  46. catch(InterruptedException e){} x-=3; if(x < -img.getWidth(this)) { x = width; } } } //方法说明:Appletg更新画面调用的方法 public void update(Graphics g) { paint(g); } // Applet绘制屏幕的方法 public void paint(Graphics g) { g.drawImage(offI,0,0,this); } }

  47. 【例12-10】用Applet显示一个钢琴键盘,并能通过鼠标点击不同的按键发出相应的声音。【例12-10】用Applet显示一个钢琴键盘,并能通过鼠标点击不同的按键发出相应的声音。 import java.applet.*; import java.awt.*;  //绘制钢琴键盘,每一个对象代表键盘上的一个按键 class Keyboard extends Canvas { Keyboard(Color c, AudioClip k) { keyColor = Color.white; keyColor = c; setBackground(keyColor); key = k; width = getSize().width; height = getSize().height; }

  48. public void paint(Graphics g) { width = getSize().width; height = getSize().height; g.setColor(Color.black); g.drawRect(0, 0, width - 1, height - 1); }   public boolean mouseDown(Event event, int x, int y) { key.play(); return true; }   Color keyColor; AudioClip key; int width; int height; }  public class Piano extends Applet { public Piano() { }   public void init() { setLayout(null); width = size().width; height = size().height; key = new Keyboard[12]; sound = new AudioClip[12]; String s = new String(""); //载入12个钢琴按键对应的声音文件 for(int i = 0; i < 12; i++) { s = i + ".au"; System.out.println(s);sound[i] = getAudioClip(getCodeBase(), s); }

More Related