日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

菜鳥初學Java的備忘錄(六)

瀏覽:25日期:2024-06-25 09:19:30
內容: 通過程序建立了實際的概念之后,現在應該回到最開始的問題,Socket是什么?是實現計算機通信的一種方式,這毫無疑問.但如何能夠用最容易理解的語言比較形象而又不偏頗的描述它的原理呢?Bruce Eckel 在他的《Java 編程思想》一書中這樣描述套接字:套接字是一種軟件抽象,用于表達兩臺機器之間的連接“終端。對于一個給定的連接,每臺機器上都有一個套接字,您也可以想象它們之間有一條虛擬的“電纜,“電纜的每一端都插入到套接字中。當然,機器之間的物理硬件和電纜連接都是完全未知的。抽象的全部目的是使我們無須知道不必知道的細節. 按我的理解,抽象點來說,一個Socket就是一個電話聽筒,你有一個,和你通話的人也有一個,只不過其中有一個人的聽筒叫ServerSocket,另一個人的聽筒叫Socket.至于誰是ServerSocket,誰是Socket,這不重要,因為客戶端和服務器端本來就是相對的,可以互相轉化的.通話的兩個人通過拿起兩個聽筒建立了一條通道,這條通道通不通就要看是不是雙方都拿起聽筒了,假如只有一方拿起聽筒,那就只能聽到一些嘟嘟的聲音,證明通道不同.這里,拿起聽筒的過程就是Socket初始化的過程.建立了通道之后,也就是大家都拿起聽筒之后,通道兩端的人就可以開始通話了.這里又有兩個過程,即A對B說話,B接聽,和B對A說話,A收聽,這兩個過程是通過兩條線路完成的.傳輸在這兩條線路上的,就是流.流隱藏了所有傳輸的細節,使得通信雙方都認為,他們傳過去的是聲音,而不是編碼.前面寫的服務器端的程序實際上是單任務版本,服務器對客戶機的處理機制是在同一時間段內只能處理一個連接,因為handleConnection中采取的是不斷循環的阻塞方法,檢測到一個,就處理一個,然后再檢測到一個,就再處理一個,如果有多個連接同時請求,那只能排隊等候.這樣的程序是無法在網絡中應付多個連接的,因為你無法保證在同一時間內只有一個客戶提出與服務器的連接請求,而用阻塞的方法應付多客戶連接其速度之慢是可想而知的.這樣就催生了面向多連接的版本.顯然,通過多線程可以來實現我們的要求.由于要解決的是處理客戶連接的問題,因此我們的工作只是在服務器端的程序當中修改.其原理不難推出,就是在檢測到一個連接請求之后,馬上建立一個線程去處理它,然后繼續兼聽下一個連接請求.所以,我們只需要將原來在handleConnection中的代碼原封不動的放到線程的執行代碼中,而在handleConnection中添加上新建線程的代碼就可以了,十分簡單.同上一篇的風格一樣,我們來觀察各個部分的代碼細節.首先為這個多線程的版本創建類MultiThreadRemoteFileServer看看這個類的定義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是一樣的,唯一的區別是在我們現在創建的這個類中增加了一個構造函數,這是為了能夠使得監聽的端口號由我們自己來定.定義如下public MultithreadedRemoteFileServer(int aListenPort) { listenPort = aListenPort;}先來看main()public static void main(String[] args) { MultithreadedRemoteFileServer server = new MultithreadedRemoteFileServer(3000); server.acceptConnections();}沒有區別吧,和RemoteFileServer的main()函數,只是端口號在創建的時候由主程序指定而已。我們主要關心的改動都在后面現在看acceptConnection監聽程序public void acceptConnections() { try { ServerSocket server = new ServerSocket(listenPort, 5);//注意到沒有,建立服務器Socket的時候多了一個參數,這個參數是用來指定能夠同時申請連接的最大數目,缺省值是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); }}改動的地方就一個,多了個參數.這里是它的工作機制。假設我們指定待發數(backlog 值)是5并且有五臺客戶機請求連接到我們的服務器。我們的服務器將著手處理第一個連接,但處理該連接需要很長時間。由于我們的待發值是 5,所以我們一次可以放五個請求到隊列中。我們正在處理一個,所以這意味著還有其它五個正在等待。等待的和正在處理的一共有六個。當我們的服務器仍忙于接受一號連接(記住隊列中還有 2—6 號)時,如果有第七個客戶機提出連接申請,那么,該第七個客戶機將遭到拒絕接著看,我們的下一個改動顯然是在處理監聽到的線程的方法handleConnection中,前面已經說了,在多線程的版本中,我們檢測到一個連接請求,就馬上生成一個線程,然后就不用理它了,那么在這里就是新建線程的一句話.public void handleConnection(Socket connectionToHandle) { new Thread(new ConnectionHandler(connectionToHandle)).start();}我們注意到有一個新的類ConnectionHandler,這個類是Runnable的,即是一個接口類(這是用接口實現的一個線程,要是有不明白的話,可以去看看17號的關于線程的東西).我們用 ConnectionHandler 創建一個新 Thread 并啟動它。正如我們剛才所說的,原來在RemoteFileServer的handleConnection中的代碼統統原封不動的轉移到了這個接口類ConnectionHandler的run()方法中來了.那么我們來看看整個ConnectionHandler類的定義吧。class ConnectionHandler implements Runnable { protected Socket socketToHandle; public ConnectionHandler(Socket aSocketToHandle) { socketToHandle = aSocketToHandle;//通過構造函數,將待處理的Socket實例作為參數傳送進來 } public void run() {//原來對Socket的讀/寫的代碼都在這里了 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())進 BufferedReader 和 PrintWriter。然后我們用這些代碼逐行地讀目標文件.由于InputStream中裝的是文件路徑,所以中間還需要使用FileReader流將文件路徑包裝,再經由BufferedReader包裝讀出.我們的多線程服務器研究完了,同樣,我們回顧一下創建和使用“多線程版的服務器的步驟:1.修改 acceptConnections() 以用缺省為 50(或任何您想要的大于 1 的指定數字)實例化 ServerSocket。2. 修改 ServerSocket 的 handleConnection() 以用 ConnectionHandler 的一個實例生成一個新的 Thread。3.借用 RemoteFileServer 的 handleConnection() 方法的代碼實現 ConnectionHandler 類的run()函數來自: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
標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
综合一区在线| 天海翼精品一区二区三区| 麻豆91小视频| 日本aⅴ亚洲精品中文乱码| 日本午夜精品久久久| 国产一区视频在线观看免费| 夜夜嗨网站十八久久| 视频在线观看一区| 综合在线一区| 欧美日韩亚洲一区三区| 精品日韩在线| 蜜臀国产一区二区三区在线播放| 四虎影视精品| 天堂资源在线亚洲| 国产综合激情| 精品美女久久| 国产精品日韩| 亚洲免费毛片| 亚洲欧美在线综合| 男女男精品网站| 日韩av在线播放中文字幕| 欧美天堂一区| 精品国产精品久久一区免费式| 欧美精品成人| 久久久国产精品入口麻豆| 福利一区在线| 在线综合亚洲| 精品国产一区二区三区2021| 91精品蜜臀一区二区三区在线 | 午夜欧美视频| 欧美女激情福利| 99在线|亚洲一区二区| 日韩精品一级中文字幕精品视频免费观看 | 少妇精品导航| 美女视频一区在线观看| 久久久久久夜| 国产精久久一区二区| 国产色综合网| 亚洲涩涩av| 视频一区欧美精品| 日韩免费福利视频| 日韩成人亚洲| 中文在线а√在线8| 日韩欧美一区二区三区免费观看| 久久xxxx| 国产精品亚洲综合在线观看| 国产日韩免费| 日韩精品久久理论片| 亚洲一区久久| 黑丝美女一区二区| 男女男精品网站| 水蜜桃久久夜色精品一区的特点 | 精品国产91| 99热精品久久| 日产精品一区二区| 99亚洲视频| 国产一区欧美| 伊人久久亚洲美女图片| 午夜日韩av| 久久久精品五月天| 91久久久久| 午夜久久免费观看| 九九在线精品| 热久久久久久久| 亚洲专区视频| 国产极品模特精品一二| 男人操女人的视频在线观看欧美| 中文无码久久精品| 亚洲天堂黄色| 国产精品红桃| 精品亚洲成人| 日本99精品| 亚洲一区二区三区无吗| a日韩av网址| 精品美女在线视频| 欧美日韩精品一区二区视频| 国产精品嫩草99av在线| 91精品国产自产在线观看永久∴| 在线亚洲一区| 蜜臀va亚洲va欧美va天堂 | 日韩av自拍| 日本不卡一区二区| 国产视频一区欧美| 97久久超碰| 久久中文字幕av一区二区不卡| 国产欧美一区二区三区精品酒店| 欧美国产美女| 日韩欧美四区| 欧美不卡高清| 国产精品久久久久久久久免费高清 | 鲁大师影院一区二区三区| 蜜臀久久久久久久| 激情综合亚洲| 99精品美女| 亚洲免费高清| 亚洲精选久久| 色爱综合网欧美| 91久久亚洲| 日本不卡视频在线| 久久免费精品| 亚洲精品高潮| 国产精品亚洲欧美一级在线| 日本中文字幕视频一区| 亚洲激情另类| 国产一区二区三区久久久久久久久| 国产精品2区| 中文字幕av一区二区三区四区| 国产精品777777在线播放 | 午夜在线一区| 久久久影院免费| 亚洲免费观看高清完整版在线观| 亚洲男女av一区二区| 日本欧美一区| 欧美日韩午夜| 国产精品美女在线观看直播| 樱桃视频成人在线观看| 久久中文字幕av一区二区不卡| 91视频久久| 国产日韩欧美一区二区三区| 亚洲精品1区| 日韩一区欧美| 青草久久视频| 久久久国产精品一区二区中文| 九九精品调教| 黄色成人91| 欧美交a欧美精品喷水| 高清一区二区三区av| 91精品啪在线观看国产18| 日本亚洲不卡| 六月丁香综合在线视频| 中文不卡在线| 久久国产66| 蜜臀久久久久久久| 高清不卡亚洲| 爽好多水快深点欧美视频| 欧美天堂视频| 日韩激情啪啪| 高清在线一区| 六月天综合网| 捆绑调教美女网站视频一区| 久久国产主播| 卡一精品卡二卡三网站乱码| 免费av一区二区三区四区| 亚洲精品激情| 麻豆久久久久久| 噜噜噜久久亚洲精品国产品小说| 麻豆国产一区| 在线亚洲国产精品网站| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 国产精品婷婷| 国产精品成久久久久| 婷婷久久免费视频| 欧美在线网站| 97精品国产福利一区二区三区| 亚洲精选久久| 国产综合视频| 日韩中文首页| 色在线中文字幕| 欧美精品九九| 日韩av片子| 免费观看久久久4p| 亚洲久久一区| 青青草国产成人99久久| 韩国女主播一区二区三区| 99视频精品| 色88888久久久久久影院| 久久精品av麻豆的观看方式| 国产精品国产三级在线观看| 日韩精品亚洲aⅴ在线影院| 天堂久久av| 伊人久久婷婷| 亚洲精品乱码久久久久久蜜桃麻豆 | 久久精品国产68国产精品亚洲| 蜜桃视频在线观看一区| 国产字幕视频一区二区| 国产毛片精品| 在线日韩电影| 亚洲二区精品| 神马午夜久久| 亚洲二区在线| 久久亚洲精品伦理| 国产伦久视频在线观看| 久久国产精品亚洲77777| 久久久久欧美精品| 国产亚洲精品自拍| 欧美成人精品三级网站| 久久久天天操| 免费观看久久av| 久久香蕉精品香蕉| 午夜久久福利| 日韩精品麻豆| 黄色国产精品| 久久99视频| 亚洲精品99| 国产精品一区二区中文字幕| 91精品在线免费视频| 成人台湾亚洲精品一区二区| 久久国产主播| 日韩精品成人| 视频一区日韩|