国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

菜鳥(niǎo)初學(xué)Java的備忘錄(六)

瀏覽:3日期:2024-06-25 09:19:30
內(nèi)容: 通過(guò)程序建立了實(shí)際的概念之后,現(xiàn)在應(yīng)該回到最開(kāi)始的問(wèn)題,Socket是什么?是實(shí)現(xiàn)計(jì)算機(jī)通信的一種方式,這毫無(wú)疑問(wèn).但如何能夠用最容易理解的語(yǔ)言比較形象而又不偏頗的描述它的原理呢?Bruce Eckel 在他的《Java 編程思想》一書(shū)中這樣描述套接字:套接字是一種軟件抽象,用于表達(dá)兩臺(tái)機(jī)器之間的連接“終端。對(duì)于一個(gè)給定的連接,每臺(tái)機(jī)器上都有一個(gè)套接字,您也可以想象它們之間有一條虛擬的“電纜,“電纜的每一端都插入到套接字中。當(dāng)然,機(jī)器之間的物理硬件和電纜連接都是完全未知的。抽象的全部目的是使我們無(wú)須知道不必知道的細(xì)節(jié). 按我的理解,抽象點(diǎn)來(lái)說(shuō),一個(gè)Socket就是一個(gè)電話聽(tīng)筒,你有一個(gè),和你通話的人也有一個(gè),只不過(guò)其中有一個(gè)人的聽(tīng)筒叫ServerSocket,另一個(gè)人的聽(tīng)筒叫Socket.至于誰(shuí)是ServerSocket,誰(shuí)是Socket,這不重要,因?yàn)榭蛻舳撕头?wù)器端本來(lái)就是相對(duì)的,可以互相轉(zhuǎn)化的.通話的兩個(gè)人通過(guò)拿起兩個(gè)聽(tīng)筒建立了一條通道,這條通道通不通就要看是不是雙方都拿起聽(tīng)筒了,假如只有一方拿起聽(tīng)筒,那就只能聽(tīng)到一些嘟嘟的聲音,證明通道不同.這里,拿起聽(tīng)筒的過(guò)程就是Socket初始化的過(guò)程.建立了通道之后,也就是大家都拿起聽(tīng)筒之后,通道兩端的人就可以開(kāi)始通話了.這里又有兩個(gè)過(guò)程,即A對(duì)B說(shuō)話,B接聽(tīng),和B對(duì)A說(shuō)話,A收聽(tīng),這兩個(gè)過(guò)程是通過(guò)兩條線路完成的.傳輸在這兩條線路上的,就是流.流隱藏了所有傳輸?shù)募?xì)節(jié),使得通信雙方都認(rèn)為,他們傳過(guò)去的是聲音,而不是編碼.前面寫(xiě)的服務(wù)器端的程序?qū)嶋H上是單任務(wù)版本,服務(wù)器對(duì)客戶機(jī)的處理機(jī)制是在同一時(shí)間段內(nèi)只能處理一個(gè)連接,因?yàn)閔andleConnection中采取的是不斷循環(huán)的阻塞方法,檢測(cè)到一個(gè),就處理一個(gè),然后再檢測(cè)到一個(gè),就再處理一個(gè),如果有多個(gè)連接同時(shí)請(qǐng)求,那只能排隊(duì)等候.這樣的程序是無(wú)法在網(wǎng)絡(luò)中應(yīng)付多個(gè)連接的,因?yàn)槟銦o(wú)法保證在同一時(shí)間內(nèi)只有一個(gè)客戶提出與服務(wù)器的連接請(qǐng)求,而用阻塞的方法應(yīng)付多客戶連接其速度之慢是可想而知的.這樣就催生了面向多連接的版本.顯然,通過(guò)多線程可以來(lái)實(shí)現(xiàn)我們的要求.由于要解決的是處理客戶連接的問(wèn)題,因此我們的工作只是在服務(wù)器端的程序當(dāng)中修改.其原理不難推出,就是在檢測(cè)到一個(gè)連接請(qǐng)求之后,馬上建立一個(gè)線程去處理它,然后繼續(xù)兼聽(tīng)下一個(gè)連接請(qǐng)求.所以,我們只需要將原來(lái)在handleConnection中的代碼原封不動(dòng)的放到線程的執(zhí)行代碼中,而在handleConnection中添加上新建線程的代碼就可以了,十分簡(jiǎn)單.同上一篇的風(fēng)格一樣,我們來(lái)觀察各個(gè)部分的代碼細(xì)節(jié).首先為這個(gè)多線程的版本創(chuàng)建類MultiThreadRemoteFileServer看看這個(gè)類的定義import java.io.*;import java.net.*;public class MultiThreadRemoteFileServer{ protected int listenPort; public MultiThreadRemoteFileServer(int aListenPort){ } public static void main(String[] args) { } public void acceptConnections() { } public void handleConnection(Socket incomingConnection) { }}幾乎和RemoteFileServer是一樣的,唯一的區(qū)別是在我們現(xiàn)在創(chuàng)建的這個(gè)類中增加了一個(gè)構(gòu)造函數(shù),這是為了能夠使得監(jiān)聽(tīng)的端口號(hào)由我們自己來(lái)定.定義如下public MultithreadedRemoteFileServer(int aListenPort) { listenPort = aListenPort;}先來(lái)看main()public static void main(String[] args) { MultithreadedRemoteFileServer server = new MultithreadedRemoteFileServer(3000); server.acceptConnections();}沒(méi)有區(qū)別吧,和RemoteFileServer的main()函數(shù),只是端口號(hào)在創(chuàng)建的時(shí)候由主程序指定而已。我們主要關(guān)心的改動(dòng)都在后面現(xiàn)在看acceptConnection監(jiān)聽(tīng)程序public void acceptConnections() { try { ServerSocket server = new ServerSocket(listenPort, 5);//注意到?jīng)]有,建立服務(wù)器Socket的時(shí)候多了一個(gè)參數(shù),這個(gè)參數(shù)是用來(lái)指定能夠同時(shí)申請(qǐng)連接的最大數(shù)目,缺省值是50 Socket incomingConnection = null; while (true) { incomingConnection = server.accept(); handleConnection(incomingConnection); } } catch (BindException e) { System.out.println('Unable to bind to port ' + listenPort); } catch (IOException e) { System.out.println('Unable to instantiate a ServerSocket on port: ' + listenPort); }}改動(dòng)的地方就一個(gè),多了個(gè)參數(shù).這里是它的工作機(jī)制。假設(shè)我們指定待發(fā)數(shù)(backlog 值)是5并且有五臺(tái)客戶機(jī)請(qǐng)求連接到我們的服務(wù)器。我們的服務(wù)器將著手處理第一個(gè)連接,但處理該連接需要很長(zhǎng)時(shí)間。由于我們的待發(fā)值是 5,所以我們一次可以放五個(gè)請(qǐng)求到隊(duì)列中。我們正在處理一個(gè),所以這意味著還有其它五個(gè)正在等待。等待的和正在處理的一共有六個(gè)。當(dāng)我們的服務(wù)器仍忙于接受一號(hào)連接(記住隊(duì)列中還有 2—6 號(hào))時(shí),如果有第七個(gè)客戶機(jī)提出連接申請(qǐng),那么,該第七個(gè)客戶機(jī)將遭到拒絕接著看,我們的下一個(gè)改動(dòng)顯然是在處理監(jiān)聽(tīng)到的線程的方法handleConnection中,前面已經(jīng)說(shuō)了,在多線程的版本中,我們檢測(cè)到一個(gè)連接請(qǐng)求,就馬上生成一個(gè)線程,然后就不用理它了,那么在這里就是新建線程的一句話.public void handleConnection(Socket connectionToHandle) { new Thread(new ConnectionHandler(connectionToHandle)).start();}我們注意到有一個(gè)新的類ConnectionHandler,這個(gè)類是Runnable的,即是一個(gè)接口類(這是用接口實(shí)現(xiàn)的一個(gè)線程,要是有不明白的話,可以去看看17號(hào)的關(guān)于線程的東西).我們用 ConnectionHandler 創(chuàng)建一個(gè)新 Thread 并啟動(dòng)它。正如我們剛才所說(shuō)的,原來(lái)在RemoteFileServer的handleConnection中的代碼統(tǒng)統(tǒng)原封不動(dòng)的轉(zhuǎn)移到了這個(gè)接口類ConnectionHandler的run()方法中來(lái)了.那么我們來(lái)看看整個(gè)ConnectionHandler類的定義吧。class ConnectionHandler implements Runnable { protected Socket socketToHandle; public ConnectionHandler(Socket aSocketToHandle) { socketToHandle = aSocketToHandle;//通過(guò)構(gòu)造函數(shù),將待處理的Socket實(shí)例作為參數(shù)傳送進(jìn)來(lái) } public void run() {//原來(lái)對(duì)Socket的讀/寫(xiě)的代碼都在這里了 try { PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream()); BufferedReader streamReader = new BufferedReader(new InputStreamReader(socketToHandle.getInputStream())); String fileToRead = streamReader.readLine(); BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead)); String line = null; while ((line = fileReader.readLine()) != null) streamWriter.println(line); fileReader.close(); streamWriter.close(); streamReader.close(); } catch (Exception e) { System.out.println('Error handling a client: ' + e); } }}ConnectionHandler 的 run() 方法所做的事情就是 RemoteFileServer 上的 handleConnection() 所做的事情。首先把 InputStream 和 OutputStream 分別包裝(用 Socket 的 getOutputStream() 和 getInputStream())進(jìn) BufferedReader 和 PrintWriter。然后我們用這些代碼逐行地讀目標(biāo)文件.由于InputStream中裝的是文件路徑,所以中間還需要使用FileReader流將文件路徑包裝,再經(jīng)由BufferedReader包裝讀出.我們的多線程服務(wù)器研究完了,同樣,我們回顧一下創(chuàng)建和使用“多線程版的服務(wù)器的步驟:1.修改 acceptConnections() 以用缺省為 50(或任何您想要的大于 1 的指定數(shù)字)實(shí)例化 ServerSocket。2. 修改 ServerSocket 的 handleConnection() 以用 ConnectionHandler 的一個(gè)實(shí)例生成一個(gè)新的 Thread。3.借用 RemoteFileServer 的 handleConnection() 方法的代碼實(shí)現(xiàn) ConnectionHandler 類的run()函數(shù)來(lái)自:csdn 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)文章:
主站蜘蛛池模板: 亚洲最大黄网 | 美国一级片免费 | 在线观看偷拍视频一区 | 精品在线免费视频 | 老司机午夜在线视频免费观 | 99精品久久精品一区二区 | 青青草国产一区二区三区 | 亚洲品质自拍网站 | 国产亚洲欧美ai在线看片 | 国产精品怡红院在线观看 | 国产三级在线免费 | 日韩天天干 | 亚洲图片偷拍区 | 欧美一区精品二区三区 | 大桥未久在线精品视频在线 | 日本精品99 | 中文字幕一区二区三 | 欧美黑人xxxxxxxxxx| 国产在线a | 国产精品久久久亚洲 | 中文在线观看视频 | 成人亚洲欧美综合 | 久久久精品免费观看 | 成人免费一级片 | 国产美女一级毛片 | 日韩天天摸天天澡天天爽视频 | 亚洲国产高清一区二区三区 | 久久人人草 | 萌白酱福利视频在线网站 | 国产综合精品在线 | 日本一级视频 | 日韩毛片在线免费观看 | 亚洲国产精品一区二区久久 | 成人久久久 | 亚洲国产精品久久人人爱 | 在线视频第一页 | 自拍视频网 | 日本在线视频观看 | 国产高清在线精品一区二区三区 | 99在线看 | 国产一及毛片 |