av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Java在C/S網(wǎng)絡(luò)中的應(yīng)用

瀏覽:83日期:2024-06-21 08:43:56
內(nèi)容: 隨著Java語言的日益流行,特別是Java與InternetWeb的密切結(jié)合,使它在全球取得了巨大的成功。Java語言以其獨立于平臺、面向?qū)ο蟆⒎植际健⒍嗑€索及完善的安全機制等特色,成為現(xiàn)代信息系統(tǒng)建設(shè)中的良好的開發(fā)平臺和運行環(huán)境。 一、Java網(wǎng)絡(luò)應(yīng)用模型 和Internet上的許多環(huán)境一樣,完整的Java應(yīng)用環(huán)境實際上也是一個客戶機/服務(wù)器環(huán)境,更確切地說是瀏覽器/服務(wù)器模型(即Browser/Server模型,簡稱Web模型)。但與傳統(tǒng)的客戶機/服務(wù)器(C/S)的二層結(jié)構(gòu)不同,應(yīng)用Java的Web模型是由三層結(jié)構(gòu)組成的。傳統(tǒng)的C/S結(jié)構(gòu)通過消息傳遞機制,由客戶端發(fā)出請求給服務(wù)器,服務(wù)器進行相應(yīng)處理后經(jīng)傳遞機制送回客戶端。而在Web模型中,服務(wù)器一端被分解成兩部分:一部分是應(yīng)用服務(wù)器(Web服務(wù)器),另一部分是數(shù)據(jù)庫服務(wù)器,Java網(wǎng)絡(luò)應(yīng)用結(jié)構(gòu)模型如圖所示: HTTP TCP/IP Java網(wǎng)絡(luò)應(yīng)用模型 針對分布式計算環(huán)境,Java通過其網(wǎng)絡(luò)類庫提供了良好的支持。對數(shù)據(jù)分布,Java提供了一個URL(UniformResourceLocator)對象,利用此對象可打開并訪問網(wǎng)絡(luò)上的對象,其訪問方式與訪問本地文件系統(tǒng)幾乎完全相同。對操作分布,Java的客戶機/服務(wù)器模式可以把運算從服務(wù)器分散到客戶一端(服務(wù)器負(fù)責(zé)提供查詢結(jié)果,客戶機負(fù)責(zé)組織結(jié)果的顯示),從而提高整個系統(tǒng)的執(zhí)行效率,增加動態(tài)可擴充性。Java網(wǎng)絡(luò)類庫是Java語言為適應(yīng)Internet環(huán)境而進行的擴展。另外,為適應(yīng)Internet的不斷發(fā)展,Java還提供了動態(tài)擴充協(xié)議,以不斷擴充Java網(wǎng)絡(luò)類庫。 Java的網(wǎng)絡(luò)類庫支持多種Internet協(xié)議,包括Telnet,FTP和HTTP(WWW),與此相對應(yīng)的Java網(wǎng)絡(luò)類庫的子類庫為: Java.net Java.net.ftp Java.net.www.content Java.net.www.html Java.net.www.http 這些子類庫各自容納了可用于處理Internet協(xié)議的類和方法。其中,java.net用于處理一些基本的網(wǎng)絡(luò)功能,包括遠(yuǎn)程登錄(Telnet);java.net.ftp用于處理ftp協(xié)議;java.net.www.content用于處理WWW頁面內(nèi)容;java.net.www.html和java.net.www.http則分別提供了對HTML語言和HTTP協(xié)議的支持。 二、客戶機/服務(wù)器環(huán)境下的Java應(yīng)用程序 客戶機/服務(wù)器在分布處理過程中,使用基于連接的網(wǎng)絡(luò)通信模式。該通信模式首先在客戶機和服務(wù)器之間定義一套通信協(xié)議,并創(chuàng)建一Socket類,利用這個類建立一條可靠的鏈接;然后,客戶機/服務(wù)器再在這條鏈接上可靠地傳輸數(shù)據(jù)。客戶機發(fā)出請求,服務(wù)器監(jiān)聽來自客戶機的請求,并為客戶機提供響應(yīng)服務(wù)。這就是典型的“請求--應(yīng)答模式。下面是客戶機/服務(wù)器的一個典型運作過程: 1.服務(wù)器監(jiān)聽相應(yīng)端口的輸入; 2.客戶機發(fā)出一個請求; 3.服務(wù)器接收到此請求; 4.服務(wù)器處理這個請求,并把結(jié)果返回給客戶機; 5.重復(fù)上述過程,直至完成一次會話過程。 按照以上過程,我們使用Java語言編寫一個分別針對服務(wù)器和客戶機的應(yīng)用程序(Application)。該程序在服務(wù)器上時,程序負(fù)責(zé)監(jiān)聽客戶機請求,為每個客戶機請求建立Socket連接,從而為客戶機提供服務(wù)。本程序提供的服務(wù)為:讀取來自客戶機的一行文本,反轉(zhuǎn)該文本,并把它發(fā)回給客戶機。 通過該程序?qū)嵗覀兛吹剑褂肑ava語言設(shè)計C/S程序時需要注意以下幾點: (1)、服務(wù)器應(yīng)使用ServerSocket類來處理客戶機的連接請求。當(dāng)客戶機連接到服務(wù)器所監(jiān)聽的端口時,ServerSocket將分配一新的Socket對象。這個新的Socket對象將連接到一些新端口,負(fù)責(zé)處理與之相對應(yīng)客戶機的通信。然后,服務(wù)器繼續(xù)監(jiān)聽ServerSocket,處理新的客戶機連接。 Socket和ServerSocket是Java網(wǎng)絡(luò)類庫提供的兩個類。 (2)、服務(wù)器使用了多線程機制。Server對象本身就是一個線程,它的run()方法是一個無限循環(huán),用以監(jiān)聽來自客戶機的連接。每當(dāng)有一個新的客戶機連接時,ServerSocket就會創(chuàng)建一個新的Socket類實例,同時服務(wù)器也將創(chuàng)建一新線程,即一個Connection對象,以處理基于Socket的通信。與客戶機的所有通信均由這個Connection對象處理。Connection的構(gòu)造函數(shù)將初始化基于Socket對象的通信流,并啟動線程的運行。與客戶機的通信以及服務(wù)的提供,均由Connection對象處理。 (3)、客戶機首先創(chuàng)建一Socket對象,用以與服務(wù)器通信。之后需創(chuàng)建兩個對象:DataInputStream和PrintStream,前者用以從Socket的InputStream輸入流中讀取數(shù)據(jù),后者則用于往Socket的OutputStream中寫數(shù)據(jù)。最后,客戶機程序從標(biāo)準(zhǔn)輸入(如:控制臺)中讀取數(shù)據(jù),并把這些數(shù)據(jù)寫到服務(wù)器,在從服務(wù)器讀取應(yīng)答消息,然后大這些應(yīng)答消息寫到到準(zhǔn)輸出。 以下本別為服務(wù)器和客戶機端的源程序清單。本程序在NT4.0網(wǎng)絡(luò)環(huán)境(TCP/IP)下使用JDK1.1調(diào)試通過。 ----1.編寫服務(wù)器類Java程序 //Server.java importjava.io.*; importjava.net.*; publicclassServerextendsThread { publicfinalstaticintDefault_Port=6543; protectdintport; protectdServerSockrtlisten_socket; //定義出錯例程: 如果出現(xiàn)異常錯誤,退出程序。 Publicstaticvoidfail(Exceptione,Stringmsg) { System.err.println(msg+':'+e); System.exit(1); } //定義并啟動服務(wù)器的Socket例程, 監(jiān)聽客戶機的連接請求。 publicServer(intport) { if(port==0)port=Default_Port; this.port=port; try { listen_socket=newServerSocket(port); } catch(IOExceptione)fail(e, 'Exceptioncreatingserversocket'); System.out.println('Server: listeningonport'+port); This.start(); } ---/*下面為服務(wù)器監(jiān)聽線程的主程序。該線程一直循環(huán)執(zhí)行,監(jiān)聽并接受客戶機發(fā)出的連接請求。對每一個連接,均產(chǎn)生一個連接對象與之對應(yīng),通過Socket通道進行通信。 */ publicvoidrun() { try { while(true) { Socketclient_socket=listen_socket.accept(); Connectionc=newConnection(client_socket); } } catch(IOExceptione)fail (e,'Exceptionwhilelisteningforconnections') } //啟動服務(wù)器主程序 publicstaticvoidmain(Stringargs[]) { intport=0; if(args.length==1) { tryport=Integer.parseInt(args[0]); catch(NumberFormatExceptione)port=0; } newServer(port); }//Endofthemain }//EndofServerclass //以下定義了Connection類, 它是用來處理與客戶機的所有通信的線程。 classConnectionextendsThread { protectedSocketclient; protectedDataInputStreamin; protectedPrintStreamout; //初始化通信流并啟動線程 publicConnection(Socketclient_socket) { client=client_socket; try { in=newDataInputStream(client.getinputStream()); out=newPrintStream(client.getOutputStream()); } catch(IOExceptione) { tryclient.close(); catch(IOExceptione2); System.err.println ('Exceptionwhilegettingsocketstreram:'+e); Return; } this.start; }//EndofConnectionmethod //服務(wù)例程:讀出一行文本; 反轉(zhuǎn)文本;返回文本。 publicvoidrun() { Stringline; StringBufferrevline; intlen; try { for(;;) { //Readaline line=in.readline(); if(line==null)break; //Reversetheline len=line.length(); revline=newStringBuffer(len); for(inti=len-1;i>=0;i--) revline.insert(len-1-I;line.charAt(i)); //Writeoutthereverseline out.println(revline); } catch(IOExceptione); finallytryclient.close(); catch(IOExceptione2); }//Endofrunmethod }//EndofConnectionclass 2.編寫客戶機類Java程序 //Client.java importjava.io.*; importjava.net.*; publicclassClientextends { publicstaticfinalintDefault_Port=6543; //定義出錯例程 publicstaticfinalvoidusage() { System.out.println('Usage: JavaClient[]'); System.exit(0); } publicstaticvoidmain(Stringargs[]) { intport=Default_Port; Sockets=null; //解析端口參數(shù) if((args.length!=1)&& (args.length!=2))usage(); if(args.length==1) port=Default_Port; else { tryport=Integer.parseInt(args[1]); catch(NumberFormaatExceptione)usage(); } try{ //產(chǎn)生一個Socket, 通過指定的端口與主機通信。 s=newSocket(args[0],port); //產(chǎn)生用于發(fā)出和接收的文本字符流 DataInputStreamsin=new DataInputStream(s.getInputStream()); PrintStreamsout=new DataInputStream(s.getInputStream()); //從控制臺讀入字符流 DataInputStreamin=new DataInputStream(System.in); //返回連接的地址和端口 System.out.println('Connected to'+s.getInetAddress() +':'+s.getPort()); Stringline; For(;;) { //顯示提示符 System.out.print('>'); System.out.flush(); //讀入控制臺輸入的一行字符 line=in.readline(); if(line==null)break; //將接收的文本行送至服務(wù)器 sout.println(line); //從服務(wù)器接收一行字符 line=sin.readline(); //Checkifconnectionis closed(i.e.forEOF) if(line==null) { System.out.println('Connectionclosedbyserver.'); Break; } //在控制臺上顯示接收的字符 System.out.println(line); }//Endofforloop }//Endoftry catch(IOExceptione)System.err.println(e); //Alwaysbesuretoclosethesocket finally { tryif(s!=null)s.close(); catch(IOExceptione2); } }//Endofmain }//EndofClient 運行該客戶機程序時,必須以服務(wù)器主機名作為第一個參數(shù),服務(wù)器端口號為第二個參數(shù),其中服務(wù)器端口號可缺省 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 在线一区| 精品视频在线一区 | 久久久91精品国产一区二区三区 | 欧美特级黄色 | 亚洲欧美激情精品一区二区 | 欧美激情久久久久久 | 天天色天天射天天干 | 久久中文高清 | 亚洲va欧美va天堂v国产综合 | 视频一区在线观看 | 日韩在线不卡视频 | 国产精品三级久久久久久电影 | 成人免费视频久久 | 久久精品二区亚洲w码 | 亚洲精彩视频在线观看 | 欧美精品一区二区免费视频 | 99久久亚洲 | 久久久久久99 | 日韩欧美视频在线 | 亚洲精品久久久久久久久久久久久 | 涩涩鲁亚洲精品一区二区 | 黄色精品| 久久国产精品免费一区二区三区 | 国产精品视频在线播放 | 97精品超碰一区二区三区 | 97操操 | 欧美性一区二区三区 | 中文字幕 国产 | 91久久精品国产 | 精品一区二区三区在线观看 | 久草精品视频 | 国产精品久久久亚洲 | 福利久久 | 老头搡老女人毛片视频在线看 | 伊久在线 | 日本色综合 | 国产欧美精品一区二区 | 成人免费视频网站在线观看 | 精品毛片 | 成人在线免费 | 亚洲天堂一区 |