Java应用技巧

Java应用技巧

Applet与Application合并
Java是一种建立分布应用程序的技术。它是网络编程的最优秀工具。使Internet的应用从通讯工具扩展到能够运行成熟应用程序的网络。
Java程序有两种类型:Applet和Application。简单讲,Applet就是嵌入Web文档的程序,而Application则是所有其它类型的程序。
就Java而言,Applet与Application的大小和复杂性都没有限制,但是因为Applet主要是用于网络通讯,由于通讯速度有限,下载时间较长,因而Applet一般来说规模较小,而对于Application则无此顾虑。
Applet与Application之间的技术差别来源于其运行环境的差别。Applet需要来自浏览器的大量信息:浏览器客户机的位置和大小、嵌入主HTML文档的参数、初始化过程(init)、启动过程(start)、停止过程(stop)、终止过程(destory)、绘图过程(paint)等等,而Application则相对要简单得多,它来自外部世界的唯一输入就是命令行参数。
对于Applet必须做为java.applet.Applet的子类,而 Application则必须有一个公共的方法main()。其次,两者的主线程是不同的,Applet是由方法init()来对applet进行初始化的,而Application则由方法main()来开始运行程序的。一般地,Java的Applet和Application是完全遵照以上的原则进行编程的,但是,我们可以运用技巧写出既是Applet又是Application的程序来。这样,既可以使我们更进一步了解Java的内部结构,又可以使同一程序运行于不同的运行环境、还可以提高研究Java的兴趣。
例程如下:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Example extends Applet implements
ActionListener{ // #1
public static void main(String[] args){
Frame win=new Frame(“Example”);
Example example=new Example();
win.add(Center", example);
example.init(); // #2
win.setSize(600,360);
win.setVisible(true);
}
public void init(){ // #3
Button button;
Label label;
button=new Button(“ OK ”):
button.setBounds(280,200,100,20);
button.addActionListener(this);
label=new Label();
label.setBounds(260,100,200,20);
add(button);
add(label);
}
public void actionPerformed(ActionEvent e){
Object source=e.getSource();
if(source==button){
label.setText(“ It is a example !”);
}
}
}
在程序中的#1处,必须让程序继承java.applet.Applet类,这是做为Applet的必要条件,在#2处,需要生成本类的一个实例example,通过此实例来调用init()方法,#3是init()方法。
如果把该程序看作Applet,它只是覆盖了init()方法和actionPerformed()方法来响应Button事件。如果作为Application,则由main()方法开始,先生成程序本身的实例将程序加入窗口,然后调用init()方法。编译此程序,即可以在提示下作为Application直接运行,又可以作为Applet送入任何浏览器。
Java中的发声提示
Java作为一种网络编程语言,在浏览器中即可以进行动画演示,也可以播放声音。在人机的交互过程中,为了加强效果或起到提示的作用,需要加入声音。
Java的包java.applet中有AudioClip接口,此接口封装有关声音片断的一些常用方法。用法如下:
AudioClip audio;
audio=getAudioClip(getCodeBase(),“Hi.au”);
audio.play();
第一行生成接口AudioClip的一个变量,第二行利用此变量取得声音文件Hi.au,此文件与程序本身在同一目录下,getCodeBase()方法是用来取得Applet的class文件的URL地址。第三行是播放声音文件。在Applet中利用此用法可在浏览器中发出声音。那么,在Application中是否也可以用此方法来发出声音呢?不可以。因为接口AudioClip是在包java.applet中,而此包只适用于Applet。是否可以用其它方法来实现呢?我们可以编写一个既是Applet又是Application的程序试试。结果,还是不行。这是因为play()方法只能在Applet中实现,对于Applicationplay()方法是不能够被调用的。
那么,如何在Application中实现发声提示呢?
记得VB中有beep语句来使系统发声器(System Speaker)发声,那么,Java中也应有类似的方法。
在Java的java.awt.Toolkit类中有方法beep()是来实现这一功能的。类Toolkit是抽象类,它是实现AWT的所有工具的父类。Java中的抽象类是不能够实例化的,但是一般地,抽象类可以生成变量,然后利用抽象类中的某一方法来取得此类的替代品。在Toolkit中是利用getDefaultToolkit()方法来实现的。现在给出一个实例:这是一个客户机/服务器的Application。当服务器运行时如果有客户机与服务器相连,则服务器会自动发声警报提示服务器端的用户有客户要与自己进行对话。
程序如下:
服务器: 
import java.util.*;
import java.io.*;
import java.net.*;
import java.awt.*;
public class ServerT{
public static void main(String[] args){
Server server;
String clientRequest;
boolean quit=false;
server=new Server(8001);
while(!quit){
DataInputStream keyboard=new DataInputStream(System.in);
try{
clientRequest=server.in.readLine();
if(clientRequest.trim().equals(“CLOSE”)){
System.out.println(“Client says: ”+clientRequest);
System.exit(1);
}
System.out.println(“Client says: ”+clientRequest);
server.out.println(keyboard.readLine());
}catch(IOException e){
System.out.println("IOException in server.in.readLine()"+e);
System.exit(1);
}
}
}
}
class Server{
private ServerSocket server;
private Socket socket;
public DataInputStream in;
public PrintStream out;
public Server(int port){
try{
server=new ServerSocket(port);
System.out.println("\n
*************************************************");
System.out.println("\n @(#)Net Applecation
Version 1.00 97/12/30 ");
System.out.println(" Copyright (c) 1997
(Lui DongBing) All Rights Reserved.");
System.out.println("\n
***************************************************");
System.out.println(“\n Server is: \n ”+server);
socket=server.accept();
for(int i=0;I < 260;i++){// 发 声 提 示
Toolkit.getDefaultToolkit().beep();
}
System.out.println(“\n Server is ready ! \n”);
in=new DataInputStream(socket.getInputStream());
out=new PrintStream(socket.getOutputStream());
out.println(“We connect in ”+new Date());
}catch(IOException e){
System.out.println(“Server is failied !”);
}
}
}
客户机:
import java.util.*;
import java.io.*;
import java.net.*;
public class ClientT{
public static void main(String[] args){
String welcome,response;
Client client;
client=new Client(“202.120.80.20”,8001); // #1
DataInputStream keyboard=new DataInputStream(System.in);
boolean Bye=false;
while(!Bye){
try{
welcome=client.in.readLine();
System.out.println(“ Server says: ”+welcome);
client.out.println(keyboard.readLine());
}catch(IOException e){
System.out.println(“\n The talk is CLOSED !”);
System.exit(1);
}
}
try{
Thread.sleep(200);
}catch(Exception e){
System.out.println(“It is a bug !”);
}
}
}
class Client{
public DataInputStream in;
public PrintStream out;
private Socket client;
public Client(String host,int port){
try{
client=new Socket(host,port);
System.out.println("\n
***************************************************");
System.out.println("\n @(#)Net Applecation
Version 1.00 97/12/30 ");
System.out.println(" Copyright (c) 1997
(Lui DongBing) All Rights Reserved.");
System.out.println("\n
**************************************************");
System.out.println(“\n Client socket:”+client);
System.out.println(“\n Client is ready ! \n”);
out=new PrintStream(client.getOutputStream());
in=new DataInputStream(client.getInputStream());
}catch(IOException e){
System.out.println(“\n IOException !\n”+e);
System.exit(1);
}
}
}
程序中#1处的“202.120.80.20”IP地址,读者可改为自己相应的地址。
(吕东兵)