![java程序設計課件_第1頁](http://file4.renrendoc.com/view/450d8e27153ff7ead1ee58a1941e226b/450d8e27153ff7ead1ee58a1941e226b1.gif)
![java程序設計課件_第2頁](http://file4.renrendoc.com/view/450d8e27153ff7ead1ee58a1941e226b/450d8e27153ff7ead1ee58a1941e226b2.gif)
![java程序設計課件_第3頁](http://file4.renrendoc.com/view/450d8e27153ff7ead1ee58a1941e226b/450d8e27153ff7ead1ee58a1941e226b3.gif)
![java程序設計課件_第4頁](http://file4.renrendoc.com/view/450d8e27153ff7ead1ee58a1941e226b/450d8e27153ff7ead1ee58a1941e226b4.gif)
![java程序設計課件_第5頁](http://file4.renrendoc.com/view/450d8e27153ff7ead1ee58a1941e226b/450d8e27153ff7ead1ee58a1941e226b5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第8章網(wǎng)絡功能北京大學計算機系代亞非2第8章網(wǎng)絡功能8.1Java與internet8.2使用URL8.3訪問cgi8.4URL連接8.5Socket8.6internet應用8.7數(shù)據(jù)報8.8JDBC8.9小結38.1Java與網(wǎng)絡Java語言取得成功的領域之一就是網(wǎng)絡
(其他語言)數(shù)頁代碼>(Java)一條語句TCP/IP(傳輸控制協(xié)議/網(wǎng)間協(xié)議)是internet的主要協(xié)議,定義了計算機和外設進行通信所使用的規(guī)則(應用層,傳輸層,網(wǎng)絡層,鏈路層).大多數(shù)基于internet的應用程序被看作TCP/IP協(xié)議的上一層.如:ftp,http,smtp,pop3,telnet,nntp等IP地址:TCP/IP網(wǎng)絡中的每臺計算機都有唯一的地址--IP地址.在Java中,有一個用來存儲internet地址的類叫InetAddress.48.1Java與網(wǎng)絡例:獲取本機的IP地址import.*;publicclassgetLocalHostTest{publicstaticvoidmain(){InetAddressmyIP=null;try{myIP=InetAddress.getLocalHost();}catch{UnknowHostExceptione){}System.out.println(myIP);}}創(chuàng)建inetAddress類不用構造函數(shù)(不用new)58.1Java與網(wǎng)絡下面的例子演示java如何根據(jù)域名自動到DNS上查找IP地址(與DNS服務器的連接減至一行)import.*;publicclassgetIP{publicstaticvoidmain(Stringargs[]){InetAddresspku=null;try{pku=InetAddress.getByName(“”);}catch(UnknowHostExceptione){}System.out.println(pku);}}68.1Java與網(wǎng)絡Java提供的網(wǎng)絡功能有三大類:URL,Socket,Datagram.URL是三大功能中最高級的一種,通過URLJava程序可以直接送出或讀入網(wǎng)絡上的數(shù)據(jù).Socket是傳統(tǒng)網(wǎng)絡程序最常用的方式,可以想象為兩個不同的程序通過網(wǎng)絡的通信信道.Datagram是更低級的網(wǎng)絡傳輸方式,它把數(shù)據(jù)的目的紀錄在數(shù)據(jù)包中,然后直接放在網(wǎng)絡上.7URLJava程序DataInputStream8.2使用URL8.2.3通過URL讀取WWW服務器上的數(shù)據(jù)將URL位置的數(shù)據(jù)轉(zhuǎn)成一個數(shù)據(jù)流URLurl=new(/index.html”DataInputStreamdata=newDataInputStream(url.openStream());從數(shù)據(jù)流中讀出數(shù)據(jù)Stringline=data.readLine()while(line!=null)line=data.readLine()88.2使用URL例:從給定的位置中讀數(shù)據(jù)(ReadURLData.prj)/connect<html><head><title><...></title></head><body>actionURLurlButtonFrame主類str=a.getText()b=url.openStream()TextAreacline_str=b.readLine()c.appendText(line_str);TextFieldaURLurl=newURL(str)DataInputStreamb98.2使用URLpublicbooleanaction(Eventevt,Objectarg){try{Stringline;Stringstr=textfield.getText(); url=newURL(str);data=newDataInputStream(url.openStream()); while((line=data.readLine())!=null){ textarea.appendText(line);}data.close(); }catch(MalformedURLExceptionme){ System.out.println("ErrorURL"); }catch(IOExceptionie){ System.out.println("ErrorIO"); }returntrue;}
10歡迎來訪,你是第個來訪者!127你是第<imgSRC=“/cgi-bin/perl/counter.cgi”>個來訪者客戶端HTML服務器端CGI程序num++imgcgi程序名8.3訪問cgi起始頁上的計數(shù)器及cgi程序(script)118.3訪問cgi<formaction="/scripts/test/query.idc"method=get>sendresetYourname數(shù)據(jù)庫服務器Web服務器cgi程序form<formaction="/scripts/test/query.idc"method=post>128.3訪問cgicgi(公共網(wǎng)關)程序可以用任何一種變成語言來寫.cgi將web與外部程序連接起來(數(shù)據(jù)庫查詢等)cgi程序要放在指定的目錄下cgi-bin目錄.cgi通常以GET或POST接收數(shù)據(jù),138.3訪問cgi從小應用中運行CGI程序(GET)Socketruncgi=newSocket(“”,80);OutputStreamos=runcgi.getOutputStream();PrintStreamps=newPringtStream(os);ps.println(“GET/cgi-bin/testcgi?arg1=val1&args2=val2&arg3=val3”);http://<機器名>/<cgi程序路徑>?<查詢串>148.3訪問cgiget方法把數(shù)據(jù)作為命令行中的參數(shù)傳遞給此cgi(適用于少量參數(shù)的情況)Javacgi程序通過main方法的串參數(shù)接受命令行.Ccgi程序通過訪問環(huán)境變量中的查詢串QUERY_STRING,來獲得查詢串中的信息.例如在C程序中:char*str;str=getevn(QUERY_STRING);158.3訪問cgiimportjava.io.*;import.*;publicclasstest_cgi{publicstaticvoidmain(String[]args)throwsException{URLurl=newURL("/~wangqb/CGI-BIN/test_2.cgi?012345678");URLConnectionconnection=url.openConnection();}}#include"stdio.h”main(){char*Query_String;Query_String=getenv("QUERY_STRING");/*treatment*/}168.3訪問cgi從小程序中運行CGI程序(post)post方法通過標準輸出向cgi傳送參數(shù)(適合參數(shù)較多的情況)用post方法要有數(shù)據(jù)輸出流Socketruncgi=newSocket(“”,80);建立socket連接DataOutputStreamds=runcgi.getOutputStream();建立輸入流ds.println(“POST/cgi-bin/guestbook.pl”);運行cgi程序178.3訪問cgi通知發(fā)送的數(shù)據(jù)類型ds.println(“Content-type:plain/text”);通知發(fā)送的數(shù)據(jù)長度Stringdata=“Helloworld”ds.println(“Content-length”+data.length+”\n”);發(fā)送數(shù)據(jù)ds.println(data);188.3訪問cgicgi接收post方法送來的數(shù)據(jù),就像從標準輸入讀數(shù)據(jù)一樣.getchar();gets();(C語言的情況)(要建立數(shù)據(jù)流)cgi返回數(shù)據(jù)時要指明數(shù)據(jù)類型等信息:printf(“Content-type:text/plain\n\n”);或printf(“Content-type:text/html\n\n”);或printf(“Content-type:image/gif\n\n”);cgi規(guī)定服務器與外部程序交換信息的協(xié)議.198.3訪問cgiStringcount_srtURLurl=newURL(“8/cgi-bin/count.cgi”);DataInputStreamdata=newDataInputStream(url.openStrean());count_str=data.readLine();(此處讀入的是cgi程序的輸出)g.drawstring(“Youarethe“+count_str+”visitor”);返回結果DataInputStream客戶端java程序服務器端cgi程序URL連接208.4URL連接URL雙向通信(URLConection)URLConnection是一個一http為中心的類
1.建立連接
URLurl=newURL(“/”);URLConnectioncon=url.openConnection();2.向服務器端送數(shù)據(jù)
PrintStreamoutStream=newPrintStream(con.getOutputStream());outStream.println(string_data);218.4URL連接3.從服務器讀數(shù)據(jù)
DataInputStreaminStream=newDataInputStream(con.getInputStream());inStream.readLine();從URL中得到的輸出流通常與一個CGI程序結合一起工作客戶端java程序DataOutputStreamDataInputStreamCGI程序STDINSTDOUT服務器(排序
sort.cgi)connectiuongetchar()putchar()228.4URL連接URLConnection同時支持get和post兩種機制一般的格式.缺省情況下位postmethod方式URL和URLConnection的區(qū)別在于前者代表一個資源的位置,后者代表一種連接下面的例子中Java程序訪問cgi程序,并傳給它10個數(shù)據(jù),cgi程序胡接收后,排序,并傳送回來.連接的建立、數(shù)據(jù)流的建立、java如何發(fā)數(shù)據(jù)、如何接收數(shù)據(jù)、cgi程序如何發(fā)送和接收238.4URL連接importjava.io.*;import.*;publicclasstest_cgi{publicstaticvoidmain(String[]args)throwsException{URLurl=newURL("/~wangqb/cgi-bin/test.cgi");URLConnectionconnection=url.openConnection(); connection.setDoOutput(true); PrintStreamout=newPrintStream(connection.getOutputStream()); out.println("0123456789"); out.close();248.4URL連接DataInputStreamin=newDataInputStream(connection.getInputStream());StringinputLine;while((inputLine=in.readLine())!=null) System.out.println(inputLine);System.in.read();in.close();258.4URL連接#include"stdio.h"main(){intarray[10];inti,j,k;printf("Content-type:text/plain\n\n");for(i=0;i<=9;i++)array[i]=getchar();//readdatafromInputStreamfor(i=0;i<=8;i++){for(j=i;j<=9;j++){if(array[i]<array[j]){k=array[j];array[j]=array[i];array[i]=k;}}}printf("\nOutputnumber!\n");for(i=0;i<=9;i++){printf("%c",array[i]);}//writedatatoOutputStream}268.5Socket8.3.1什么是socket?Socket是網(wǎng)絡上運行的程序之間雙向通信鏈路的最后終結點網(wǎng)絡服務Mailftpfinger20telnet數(shù)據(jù)結構I/O緩沖區(qū)端口2123客戶程序SocketIP,portIP與端口的組合得出一個套接字,可以完全分辨internet上運行的程序27internet服務端口號端口號internet服務telnet23nntp119ftp21www80DNS53POP31108.5Socket端口號:TCP/IP協(xié)議為每種服務定義了一個端口,當一臺計算機上運行不同服務器程序時,,根據(jù)端口號不同提供相應的服務.端口號不是計算機上的物理連接器,它只是具有軟件意義的假想端口288.5Socket在服務器端通過指定一個用來等待的連接的端口號創(chuàng)建一個ServerSocket實例.在客戶端通過規(guī)定一個主機和端口號創(chuàng)建一個socket實例,連到服務器上.ServerSocket類的accept方法使服務器處于阻塞狀態(tài),等待用戶請求Socket類和ServerSocket是基于TCP協(xié)議的,TCP協(xié)議提供64個端口,256以內(nèi)位保留端口.298.5Socket在本地機器上測試網(wǎng)絡程序用回送地址Socketsocket=newSocket(“”,2525);如果網(wǎng)絡的一端已經(jīng)關閉,另一端讀到null.建立socket連接后,還應該建立輸入輸出數(shù)據(jù)流.308.5SocketServerServerSocket(port#)ServerSocket.accept()Socket()OutputStreamInputStreamCloseSocketClientSocket(host,port#)AttempttheconnectionOutputStreamInputStreamCloseSocket318.5Socket下面的例子演示一個簡單的服務器與客戶的交互,即服務器等待,客戶訪問,相互通一次信息.328.5Socket.8.5Socket創(chuàng)建服務器(端口號)定義數(shù)據(jù)成員服務器等待網(wǎng)絡連接建立socket流讀客戶端信息向用戶發(fā)出一個字符串創(chuàng)建Socket實例定義數(shù)據(jù)成員建立socket流讀socket流(接收并顯示)送用戶名給服務器關閉流waitingforuser11111111login:connetctingclient...java提示用戶登錄成功讀socket流User:javaLoginsuccessful338.5Socket例:顯示服務器與客戶機間的通信(服務器端)PrintStreamps=null;DataInputStreamdis=null;Stringusername;ServerSocketserverSocket=null;SocketclientSocket=null;try{serverSocket=newServerSocket(1111);}catch(IOExceptione){System.out.println(“Error”+e);System.exit(1);}try{clientSocket=serverSocket.accept();}catch(IOExceptione){System.out.println("Acceptfailed.");System.exit(1);}創(chuàng)建服務器(端口號)定義數(shù)據(jù)成員服務器等待網(wǎng)絡連接348.5Socket.ps=newPrintStream(clientSocket.getOutputStream());dis=newDataInputStream(clientSocket.getInputStream());創(chuàng)建服務器(端口號)定義數(shù)據(jù)成員服務器等待網(wǎng)絡連接建立socket流向客戶發(fā)出登錄要求ps.println("login:");ps.flush();358.5Socketps.println("loginsucessful");ps.flush();System.out.println(username+"hasloggedoff");}讀客戶端信息創(chuàng)建服務器(端口號)定義數(shù)據(jù)成員服務器等待網(wǎng)絡連接建立socket流向用戶發(fā)出登錄要求通知客戶連接完畢if((username=dis.readLine())==null){ System.out.println("readLinereturnednull"); System.exit(1);}System.out.println("Username:"+username);368.5Socket例:顯示服務器與客戶機間的通信(客戶端)創(chuàng)建Socket實例PrintStreamoutput;DataInputStreaminput;Stringstring; Socketsocket=null;定義數(shù)據(jù)成員try{socket=newSocket("",1111);}catch(IOExceptione){System.out.println("Error”+e);return;}
input=newDataInputStream(socket.getInputStream());output=newPrintStream(socket.getOutputStream());
建立socket流37.8.5Socket.System.out.println(input.readLine());創(chuàng)建Socket實例定義數(shù)據(jù)成員建立socket流讀socket流(看到提示)System.in.read(bArray);Strings=newString(bArray,0);output.println(s);從鍵盤上讀送用戶名送給服務器端關閉流socket.close();input.close();output.close();System.out.println("Done");System.out.println(input.readLine());System.out.print("Loggingoff...");讀服務器反饋38.8.5Socket.8.5Socket創(chuàng)建服務器(端口號)定義數(shù)據(jù)成員服務器等待網(wǎng)絡連接建立socket流讀客戶端信息向用戶發(fā)送字符串創(chuàng)建Socket實例定義數(shù)據(jù)成員建立socket流讀socket流(看到提示)送用戶名給服務器關閉流waitingforuser11111111login:connetctingclient...java提示用戶登錄成功讀socket流User:javaLoginsuccessful398.5Socket支持多客戶一種解決方案:一臺計算機上一次啟動多個服務器程序,只要端口號不同.\myjava\clientAndServerTestmyserver<>myclientf8.batmyserver2<>myclient2f9.batServer1(1111)client(2222)Server2(2222)client(1111)Computer1408.5Socket第二種方案:(支持多客戶)Serverclient1client2serverthreadserverthread將服務器寫成多線程的,不同的線程為不同的客戶服務.main()只負責循環(huán)等待線程負責網(wǎng)絡連接,接收客戶輸入的信息418.5Socket.客戶1客戶2服務器線程()線程2線程()線程()42.8.5Socket創(chuàng)建服務器(端口號)定義數(shù)據(jù)成員服務器等待網(wǎng)絡連接建立socket流讀客戶端信息提示用戶輸入客戶名創(chuàng)建Socket實例定義數(shù)據(jù)成員建立socket流讀socket流(看到提示)送用戶名給服務器關閉流waitingforuser11111111login:connetctingclient...java提示用戶登錄成功讀socket流User:javaLoginsuccessful438.5Socketpublicstaticvoidmain(Stringargs[]){ServerSocketserverSocket=null;try{serverSocket=newServerSocket(1111);}catch(Exceptione){ System.out.println(”Error”+e);System.exit(1);}while(true) {SocketclientSocket=null; System.out.println("waitingforusers..."); try {clientSocket=serverSocket.accept(); }catch(IOExceptione){ System.out.println("acceptfailed:"+e);}
newserverThread(clientSocket).start(); }}448.5SocketclassserverThreadextendsThread{DataInputStreaminput;PrintStreamoutput;Stringuser;SocketclientSocket;serverThread(SocketclientSocket){this.clientSocket=clientSocket;}publicvoidrun(){try{input=newDataInputStream(clientSocket.getInputStream());
output=System.out;user=input.readLine();System.out.println(user+"Connected!");}catch(IOExceptione){}try{while(true){Stringstring;if((string=input.readLine())==null)break;output.println(user+string);output.flush();}}catch(Exceptione){ return;} System.out.println(user+"hasdisconnected.");try{clientSocket.close();input.close(); }catch(Exceptione){return;}}}45serverHello1076Hello1071abcWAITGO…abcWAITGO…defdef
8.5Socket例:通過服務器交換信息(exchangebyserver)468.5Socket.服務器(1111)acceptsocket客戶IPclient1線程客戶IPclient2線程服務器一端為了能接收多個客戶的信息,它的輸入流,輸出流都是數(shù)組型的.ServerSocket.accept()等待用戶連接,一旦連接上,則調(diào)用服務程序.服務程序的主要內(nèi)容是網(wǎng)絡的讀寫,多客戶的原因,網(wǎng)絡讀寫的功能用多線程實現(xiàn),因此將此部分功能單獨分離出來,構成線程類478.5Socketclient1client2serviceRequestserverServerSocketSocketgetOutputStreamgetInputStreamreader.runreader.run服務器端accept()reader.start()read_net_inputwrite_net_output()48client()write.runwrite_net_output()read_net_input()close_server()客戶端writer.start()paint()socketgetLocalPort()getInputStreamgetOutputStream服務器8.5Socket498.7DatagramTCP/IP傳輸層由兩個并列的協(xié)議:TCP,UDP.一般套接字(TCP)提供一個可靠的傳輸模型作為兩個網(wǎng)絡端點的字節(jié)流,有糾錯能力.UDP沒有保持的連接和數(shù)據(jù)流,數(shù)據(jù)報是一個網(wǎng)絡上發(fā)送的獨立信息,它的到達,到達時間,以及內(nèi)容不能得到保證.socketserverclientdatagramserverclient508.7DatagramTCP提供高可靠性服務,適用于一次要傳輸交換大量報文的情況,信道上傳遞的包不需要源地址和目的地址UDP提供高效率服務,適用于依次傳輸交換少量報文的情形(如數(shù)據(jù)庫查詢),每個數(shù)據(jù)包要包含目的地址和端口號.數(shù)據(jù)報文的使用以包為中心:打包,拆包.J包支持兩種不同的在網(wǎng)絡上送數(shù)據(jù)的方法:一般套接字和數(shù)據(jù)報文套接字.518.7Datagram發(fā)出報文的標準步驟如下:1.定義數(shù)據(jù)成員
DatagramSocketsocket;DatagramPacketpacket;InetAddressaddress;(用來存放接收方的地址)intport;;(用來存放接收方的端口號)2.創(chuàng)建數(shù)據(jù)報文Socket對象
try{socket=newDatagramSocket(1111);}catch(.SocketExceptione){}socket綁定到一個本地的可用端口,等待接收客戶的請求.528.7Datagram3.分配并填寫數(shù)據(jù)緩沖區(qū)(一個字節(jié)類型的數(shù)組)byte[]Buf=newbyte[256];
存放從客戶端接收的請求信息.4.創(chuàng)建一個DatagramPacketpacket=newDatagramPacket(buf,256);
用來從socket接收數(shù)據(jù),它只有兩個參數(shù)
5.服務器阻塞
socket.receive(packet);
在客戶的請求報道來之前一直等待538.7Datagram6.從到來的包中得到地址和端口號
InetAddressaddress=packet.getAddress();intport=packet.getPort();7.將數(shù)據(jù)送入緩沖區(qū)或來自文件,或鍵盤輸入8.建立報文包,用來從socket上發(fā)送信息
packet=newDatagramPacket(buf,buf.length,address,port);9.發(fā)送數(shù)據(jù)包10.關閉socketsocket.send(packet);socket.close();548.7Datagram客戶端接收包的步驟如下:1.定義數(shù)據(jù)成員
intport;InetAddressaddress;DatagramSocketsocket;DatagramPacketpacket;byte[]sendBuf=newbyte[256];2.建立socketsocket=newDatagramSocket();558.7Datagram3.
向服務器發(fā)出請求報文
address=InetAddress.getByName(args[0]);port=parseInt(args[1]);packet=newDatagramPacket(sendBuf,256,address,port);socket.send(packet);
這個包本身帶有客戶端的信息4.
客戶機等待應答
packet=newDatagramPacket(sendBuf,256);socket.receive(packet);(如果沒有到就一直等待,因此實用程序要設置時間限度)568.7Datagram5.處理接收到的數(shù)據(jù)
Stringreceived=newString(packet.getData(),0);System.out.println(received);數(shù)據(jù)報套接字首先是強調(diào)發(fā)送方和接收方的區(qū)別,同時也指出服務器和客戶之間的不同:一個客戶機必須事先知道服務器的地址和端口,以便進行出事連接一個服務器從它接收到的數(shù)據(jù)報文中讀取客戶端的地址和端口.578.7Datagram.建立數(shù)據(jù)報socket();建立一個報文包packet等待請求報文建立數(shù)據(jù)報socket建立一個請求包發(fā)出請求獲得對方地址構成信息包發(fā)送出去創(chuàng)建接收包等待接收588.8小結實現(xiàn)網(wǎng)絡功能要靠URL類,URLConection類,Socket類和DatagramSocket類網(wǎng)絡上的數(shù)據(jù)傳送是將網(wǎng)絡連接轉(zhuǎn)換成輸入輸出流DataInputStream和DataOutputStream(PrintStream)是網(wǎng)間流的載體.URL適用于web應用,如訪問http服務器是高層服務URLConection的另一邊通常是cgi程序cgi程序完成客戶端與外部程序的交互598.6小結向cgi傳送數(shù)據(jù)有get和post兩種方法cgi通過訪問環(huán)境變量或讀標準輸入獲得數(shù)據(jù)回繞地址可用于在本地機器上調(diào)試網(wǎng)絡程序Socket適用于面向連接的,可靠性要求高的應用Datagram適用于效率要求高的應用Socket是由IP和端口構成的一種網(wǎng)上通信鏈路的一端Socket通信要分別運行服務器和客戶程序服務器程序是多線程的,可處理多個客戶的請求60第2章Java小應用2.1所有小應用程序的根源2.2小試身手2.3圖形操作2.4URL類2.5載入現(xiàn)有圖像文件2.6動畫效果2.7播放聲音2.8小結612.1所有小應用程序的根源2.1.1小應用的特點回憶一下小應用程序的書寫格式
importjava.applet.*;publicclassMyAppletextendsApplet{;}applet都繼承自java.applet.Applet類,由Sun公司事先定義好了.每個小應用都有一個主程序類,之前必須加上public.622.1所有小應用程序的根源http://someLocation/file.html1.BrowserloadsURL<Html><Appletcode=….></Applet>2.BrowserloadsHTMLdocumentAppletclass3.BrowserloadsappletclassesLocation:http://someLocation/file.htmlLoading...4.Browserrunapplet632.1所有小應用程序的根源Applet的限制appletBrowserSERVER本地程序fileSERVERlocalconnectionconnectionApplet被下載的與applet無關的本地方法642.1所有小應用程序的根源2.1.2applet的生命周期paint()雖不在生命周期內(nèi),但它的作用相當于applet的靈魂Java.applet.Appletpublicvoidinit()publicvoiddestroy()publicvoidstart()publicvoidstop()publicvoidpaint(Graphicsg)652.1所有小應用程序的根源一個applet的可視周期initstartstopdestroy離開web頁面重新裝入或改變頁面大小或返回Web頁面662.1所有小應用程序的根源有關paint()方法Applet本身是一個容器,因此任何輸出都必須用圖形方法paint()當小應用首次被裝載,以及每次窗口放大、縮小、刷新時都要調(diào)用paint方法paint()是由瀏覽器調(diào)用的,而不是由程序調(diào)用,當程序希望調(diào)用paint方法時,用repaint命令paint方法的參數(shù)是Graphics類的對象g,它在java.awt.Graphics內(nèi)paint(Graphicdg){。。。}672.1所有小應用程序的根源AWTthread(waiting)update(){cleararaecallpaint()paint()repaint()Exposure682.2小試身手2.2.1起始頁上的時間和日期介紹兩個類:1.類名:Date
創(chuàng)建一個實例DatetimeNow=newDate();2.類名Font
創(chuàng)建一個實例FontmsgFont=newFont(“TimesRoman”,Font.ITALIC,30);0MonDec0714:23:50GMT+08:001998692.2小試身手
看下面的例子,想一想生命周期的四個方法哪去了?importjava.awt.*;importjava.util.Date;publicclassshowDateextendsjava.applet.Applet{DatetimeNow=newDate();FontmsgFont=newFont(“TimesRoman”,Font.ITALIC,30);publicvoidpaint(Graphicsg){g.setFont(msgFont);g.setColor(Color.blue);g.darwString(timeNow.toString(),5,50);}702.2小試身手2.2.2在起始頁中加入applethtml中有關的代碼
<APPLETCODE=“showdate.class”width=600height=80></APPLET>CODEBASE的作用當class文件與起始頁文件不在同一個目錄下時,使用CODEBASE說明
<APPLETCODE=“showdate.class”width=600height=80>CODEBASE=“\myjava\class”</APPLET>712.2小試身手<APPLETCODE=“showdate.class”width=600height=80>CODEBASE=“\myjava\class”</APPLET>C:\publicIndex.htmlmyjavaclassshowdatejavacodeC:\publicIndex.htmlmyjavaclassshowdatejavacode<APPLETCODE=“showdate.class”width=600height=80></APPLET>722.2小試身手ALIGN,HSPACE,VSPACEJavaapplet其它文字其它文字vspacehspace<APPLETCODE=“showdate.class”width=600height=80>vspace=100hspace=100</APPLET>732.2小試身手向applet傳遞參數(shù)的兩個步驟
1.在起始頁中要有<PARAM>標簽
2.在applet中要有getParameter方法在起始頁中有:<appletcode=showdatewidth=600heigt=80><paramname=remvalue=“時間是:”></applet>在applet中有:stringtitle=getParameter(rem);在顯示時間的命令中加入title:g.drawString(title+timeNow.toString(),5,50);742.2小試身手importjava.awt.*;importjava.util.Date;publicclassshowDateextendsjava.applet.Applet{DatetimeNow=newDate();Stringtitle;FontmsgFont=newFont(“TimesRoman”,Font.ITALIC,30);publicvoidinit(){title=getParameter(“rem”);if(title==null)title=“”;}publicvoidpaint(Graphicsg){g.setFont(msgFont);g.setColor(Color.blue);g.darwString(title+timeNow.toString(),5,50);}752.2小試身手例:利用一個可以顯示運行字符串的類,顯示自己的字符串(htmlpara.html)<appletcode=htmlpara.classwidth=300heigh=200><paramname=MESSAGEvalue=”thisisatest"><paramname=FONTvalue="BOLD"><paramname=POINT_SIZEvalue=20></applet>762.2小試身手publicvoidinit(){ Stringparamete; parameter=getParameter("MESSAGE"); if(parameter!=null) message=parameter;parameter=getParameter("FONT"); if(parameter!=null) font_to_use=parameter;parameter=getParameter("POINT_SIZE");if(parameter!=null) point_size=Integer.parseInt(parameter);}772.3圖形處理2.3.1圖形坐標系統(tǒng)任何與繪圖有關的操作第一個要用的是java.awt.Graphics類Graphics類的對象不是由new產(chǎn)生的,而是由系統(tǒng)或其他方式直接將生好的Graphics對象當作方法的參數(shù),再交給程序設計者去處理.例如:paint(Graphicsg)xy0782.3圖形處理Graphics的方法paint(Graphicsg){g.clearRect(); g.copyArea();g.drawAre();g.drawLine();g.drawOval();g.drawRect();g.drawPolygon();g.fillArc();g.fillOval();g.fillPolygen();g.fillRect();g.getColor(); g.getFont()g.setFont();g.setColor(); g.getFontMetrics()g.fillRoundRect()}792.3圖形處理2.3.2字型和顏色的設置
字型設置的方法
Fontfont=newFont(“TimesRoman”,Font.ITALIC,24);g.setFont(font);在小應用程序中顯示輸出的方法
g.drawString(String,intx,inty);g.drawChars(chardata[],intoffset,intlength,intx,inty);802.3圖形處理g.drawBytes(bytedata[],intoffset,intlength,intx,inty);例:g.drawString(“Thisisatest”,5,10);獲取字體的屬性
Fontfont=g.getFont();Font類中常用的方法
GetFamily() getName() getSize() getStyle()isItalic() isPlain() isBold() toString() 812.3圖形處理importjava.awt.Graphics;importjava.awt.Font;publicclassdrawtextextendsjava.applet.Applet{Fontfn=newFont("TimesRoman",Font.ITALIC,20); publicvoidpaint(Graphicsg) {g.setFont(fn); g.drawString(”Fontdemo”,5,10);}}Fontdemo822.3圖形處理獲取更詳細的數(shù)據(jù) 請查閱有關FontMetrics類的方法
fontMetrics=getFontMetrics(font);FontMetrics中比較重要的方法有:stringWidth,charWidth,getAscent,getDescent,getLeading,getHeigh832.3圖形處理
顏色的調(diào)整Color對象的使用創(chuàng)造自己的顏色:Colormycolor=newColor(intred,intblue,intgreen);g.setColor(Color.yellow)g.setColor(mycolor);例:隨機產(chǎn)生顏色,并畫圓842.3圖形處理importjava.awt.Graphics;importjava.awt.Color;publicclassdrawcircleextendsjava.applet.Applet{ publicvoidpaint(Graphicsg){ intred,green,blue,x; for(x=0;x<370;x+=30){red=(int)Math.floor(Math.random()*256); green=(int)Math.floor(Math.random()*256); blue=(int)Math.floor(Math.random()*256); g.setColor(newColor(red,green,blue)); g.fillOval(x,0,30,30); }}}852.4URL類2.4.2構造URL類(全名java.lang.URL)絕對URL的構造方法:URL(Stringspec)
例:URLurl=newURL(/cv/index.html”)相對URL的構造方法:
某絕對地址:/test.html
在該目錄下有兩個文件
mywork.htmlmyfamily.html862.4URL類URLbase=newURL(“”);URLurl1=new(base,“mywork.html”);URLurl2=new(base,“mywork.html”);其他URL的構造方法:URLurl=newURL(“http”,“”,“/~dyf/test.html”);872.4URL類2.4.3獲取小應用程序HTML頁面的URL和小應用程序本身的URLURLhtml=getDocumentBase();System.out.print(html);URLcodebase=getCodeBase();System.out.print(codebase);瀏覽器服務器htmlappletwebpage882.4URL類2.4.4URL異常(MalformedURLException)
當創(chuàng)建URL時發(fā)生錯誤,系統(tǒng)會產(chǎn)生異常
try{URLurl=newURL(str);}catch(MalformedURLException(e){DisplayErrorMessage();}2.4.5URL類的基本方法
StringgetProtocol(),StringgetHost(),inggetPort(),StringgetFile(),StringgetRef()892.4URL類構造URL的實例import.URL;import.MalformedURLException;publicclassTest{URLurl1,url2,url3;voidtest(){try{url1=newURL(“file:/D:/image/example.gif”);url2=newURL(“/cv/”);url1=newURL(url2,“hit.gif”);}catch(MalformedURLExceptione);//處理例外
}}}902.5載入現(xiàn)有圖像文件Image類java支持gif和jpg兩種格式的圖像圖像文件的URL:URLpicurl=newURL(“/Applet/img1.gif”);取一幅圖像構成圖像對象
Imageimg1=getImage(picurl);Imageimg2=getImage(getCodeBase(),“img2.gif”);912.5載入現(xiàn)有圖像文件顯示一幅圖像:g.drawImage(img1,x,y,this);g.drawImage(img1,x,y,Color.red,this);g.drawImage(image1,x,y,x2,y2,Color.red,this);規(guī)定背景規(guī)定尺寸922.5載入現(xiàn)有圖像文件完整的過程不要忘記AWT包定義Image對象了嗎?指定圖像的URL了嗎?把圖像取出來吧.還記得畫圖像用什么方法和命令嗎?在類中在init0中在paint0中932.5載入現(xiàn)有圖像文件importjava.applet.*;importjava.awt.*;publicclassimageextendsApplet{ Imageimg;publicvoidinit(){img=getImage(getCodeBase(),"img0001.gif");}publicvoidpaint(Graphicsg){intwidth=img.getWidth(this); intheight=img.getHeight(this);g.drawRect(52,52,width+30,height+30);g.drawImage(img,57,57,width+20,height+20,this);}}942.6動態(tài)效果線程的應用2.4動態(tài)效果線程的應用什么是線程?
線程是執(zhí)行中的程序中的單個順序控制流.Java支持多線程開始顯示進度引出最后結果數(shù)學運算線程1線程2952.6動態(tài)效果線程的應用靜態(tài)的情況importjava.applet.*;importjava.awt.Graphics;publicclassmagueeextendsApplet{ publicvoidpaint(Graphicsg) { g.drawString("Hello,Java!",0,0); }}962.6動態(tài)效果線程的應用動態(tài)的情況(不是多線程)publicvoidinit(){ x=size().width; y=size().height/2; width=x;}publicvoidpaint(Graphicsg){while(true){ g.drawString("Hello,Java!",x,y); x-=10; if(x<0) x=width;}} 972.6動態(tài)效果線程的應用實現(xiàn)一個線程讓Applet類去實現(xiàn)Runable接口,創(chuàng)建一個線程類改寫方法start,在其中產(chǎn)生一個新的線程來工作改寫stop方法,在其中編寫結束線程的程序代碼引入新的方法,將分給線程的工作寫到run中982.6動態(tài)效果線程的應用第一步:實現(xiàn)Runable接口publicclassxcextendsjava.applet.AppletimplementsRunnable{Threadsmallthread=null;…}Thread是一個類,只有是它的實例才能具有線程的功能主函數(shù)中要定義一個線程變量992.6動態(tài)效果線程的應用第二步:改寫方法startpublicvoidstart(){if(smallthread==null)
{smallthread=newThread(this);
smallthread.start();//從現(xiàn)在開始程序由兩個線程在執(zhí)行
}}第三步:改寫stop方法publicvoidstop(){smallthread.stop();//停止線程
smallthread=null;//釋放線程對象}1002.6動態(tài)效果線程的應用第四步:新的方法run將讓線程要做的事放run中publicvoidrun(){while(true){
repaint();try{Thread.sleep(1000);}catch(InterruptedExceptione){}}}1012.6動態(tài)效果線程的應用importjava.applet.*;importjava.awt.Graphics;publicclassMovingCharacterextendsAppletimplementsRunnable{intx=200;Threadmy_thread=null;//publicvoidstart(){my_thread=newThread(this);my_thread.start();}publicvoidrun(){while(true){ repaint(); try{ Thread.sleep(100); }catch(InterruptedExceptione){}}}1022.6動態(tài)效果線程的應用.publicvoidpaint(Graphicsg){g.drawString("Hello,Java!",x,y);x-=10;if(x<0) x=200;}publicvoidstop(){my_thread.stop();}1032.6動態(tài)效果線程的應用跳動的小球up=false;x=x-10;if(x<0)x=width;if(up)y=y+10;elsey=y-10;if(y<0)up=true;if(y>height)up=false;g.setColor(Color.red);g.fillOval(x,y,30,30);
1042.6動態(tài)效果線程的應用例:起始頁上的小時鐘一個必須用到的類Date類,給出系統(tǒng)時間DateNowTime=newDate();NowTime.getHours(),NowTime.getMinutes()自己需要寫什么樣的類?Clock把數(shù)字時間成圖形表示(Hour*60*60+minute*60+second)/43200*2.0*PI(minute*60+second)/3600*2.0*PIsecond/60*2.0*PI1052.6動態(tài)效果線程的應用取時間paint(){}主類換算弧度畫圖clock類clock(){}初始化Show(){}drawNiddle(){}1062.6動態(tài)效果線程的應用classClock{inthours,minutes,second,radius;Clock(inthrs,intmin,intsec){hours=hrs%12;minutes=min;second=sec;}voidshow(Graphicsg,intx,inty,intredius){inthrs_len=(int)(radius*0.5);intmin_len=(int)(radius*0.7);intsec_len=(int)(radius*0.85);doubletheta;g.drawOval(x,y,radius*2,radius*2);
1072.6動態(tài)效果線程的應用theta=(double)(hours*60*60+minutes*60+second)/43200.0*2.0*Math.PI;drawNiddle(g,Color.blue,x,y,hrs_len,theta);theta=(double)(minutes*60-second)/3600.0*2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 朝陽2024年遼寧朝陽師范學院招聘37人筆試歷年參考題庫附帶答案詳解
- 攀枝花2025年四川攀枝花市民政局直屬事業(yè)單位考調(diào)4人筆試歷年參考題庫附帶答案詳解
- 2025年中國沖天爐數(shù)字式綜合檢測儀市場調(diào)查研究報告
- 2025至2031年中國高壓均質(zhì)機行業(yè)投資前景及策略咨詢研究報告
- 2025至2031年中國耐低溫型不干膠行業(yè)投資前景及策略咨詢研究報告
- 2025至2031年中國直流脈寬調(diào)速器行業(yè)投資前景及策略咨詢研究報告
- 2025年活門項目可行性研究報告
- 2025至2031年中國易洗除漬素行業(yè)投資前景及策略咨詢研究報告
- 2025至2031年中國嬰兒玩具拉琴行業(yè)投資前景及策略咨詢研究報告
- 2025年女裝牛仔中褲項目可行性研究報告
- 浙江省2023年中考科學真題全套匯編【含答案】
- 《公益性公墓管理章程》-
- C++面向?qū)ο蟪绦蛟O計雙語教程(第3版)課件全套 ch01Introduction-ch08Templates
- 小說標題作用探究省名師優(yōu)質(zhì)課賽課獲獎課件市賽課一等獎課件
- dk膠原蛋白培訓課件
- 短視頻拍攝時間計劃表
- 動物檢疫技術-動物檢疫處理(動物防疫與檢疫技術)
- 英語經(jīng)典口語1000句
- PDCA案例降低心臟介入手術并發(fā)癥
- 完整,滬教版小學四年級英語上冊單詞表
- 全國教育科學規(guī)劃課題申請書
評論
0/150
提交評論