轉(zhuǎn)帖|其它|編輯:郝浩|2010-05-31 11:39:31.000|閱讀 639 次
概述:這里我們將討論 handleConnection() 方法的結(jié)構(gòu),這個(gè)方法生成一個(gè)新的 Thread 來處理每個(gè)連接。我們將分兩部分討論這個(gè)問題。這一屏我們將著重該方法本身,然后在下一屏研究該方法所使用的 ConnectionHandler 助手類的結(jié)構(gòu)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Java while循環(huán)語句會(huì)有很多重要的環(huán)節(jié)都使用到。下面我們就來看看相關(guān)的問題解決方案和相關(guān)的代碼。希望大家在之后的學(xué)習(xí)和生活中能更好的使用Java while循環(huán)語句。
這里我們將討論 handleConnection() 方法的結(jié)構(gòu),這個(gè)方法生成一個(gè)新的 Thread 來處理每個(gè)連接。我們將分兩部分討論這個(gè)問題。這一屏我們將著重該方法本身,然后在下一屏研究該方法所使用的 ConnectionHandler 助手類的結(jié)構(gòu)。
Java代碼
1.public void handleConnection(Socket connectionToHandle) { 2.new Thread(new ConnectionHandler(connectionToHandle)). start(); 3.} 4.public void handleConnection(Socket connectionToHandle) { 5.new Thread(new ConnectionHandler(connectionToHandle)). start(); 6.} |
我們對 RemoteFileServer 所做的大改動(dòng)就體現(xiàn)在這個(gè)方法上。我們?nèi)匀辉诜?wù)器接受一個(gè)連接之后調(diào)用 handleConnection() ,但現(xiàn)在我們把該 Socket 傳遞給 ConnectionHandler 的一個(gè)實(shí)例,它是 Runnable 的。我們用 ConnectionHandler 創(chuàng)建一個(gè)新 Thread 并啟動(dòng)它。ConnectionHandler 的 run() 方法包含Socket 讀/寫和讀 File 的代碼,這些代碼原來在 RemoteFileServer 的 handleConnection() 中。
4. 處理連接:第 2 部分
這里是 ConnectionHandler 類的結(jié)構(gòu):
Java代碼
7.import java.io.*; 8.import java.net.*; 9.public class ConnectionHandler implements Runnable{ 10.Socket socketToHandle; 11.public ConnectionHandler(Socket aSocketToHandle) { 12.socketToHandle = aSocketToHandle; 13.} 14.public void run() { 15.} 16.} 17.import java.io.*; 18.import java.net.*; 19.public class ConnectionHandler implements Runnable{ 20.Socket socketToHandle; 21.public ConnectionHandler(Socket aSocketToHandle) { 22.socketToHandle = aSocketToHandle; 23.} 24.public void run() { 25.} |
這個(gè)助手類相當(dāng)簡單。跟我們到目前為止的其它類一樣,我們導(dǎo)入 java.net 和 java.io 。該類只有一個(gè)實(shí)例變量 socketToHandle ,它保存由該實(shí)例處理的 Socket 。類的構(gòu)造器用一個(gè) Socket 實(shí)例作參數(shù)并將它賦給 socketToHandle 。
請注意該類實(shí)現(xiàn)了 Runnable 接口。實(shí)現(xiàn)這個(gè)接口的類都必須實(shí)現(xiàn) run() 方法,我們的類就是這樣做的。稍后我們將探究 run() 的細(xì)節(jié)。現(xiàn)在只需知道它將實(shí)際處理連接,所用的代碼跟我們先前在 RemoteFileServer 類中看到的是一樣的。
實(shí)現(xiàn) run()
這里我們實(shí)現(xiàn) run() 方法,它將攫取我們的連接的流,用它來讀寫該連接,并在任務(wù)完成之后關(guān)閉它:
Java代碼
26.public void run() { 27.try { 28.PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream()); 29.BufferedReader streamReader = 30.new BufferedReader(new InputStreamReader(socketToHandle.getInputStream())); 31.String fileToRead = streamReader.readLine(); 32.BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead)); 33.String line = null; 34.while ((line = fileReader.readLine()) != null) 35.streamWriter.println(line); 36.fileReader.close(); 37.streamWriter.close(); 38.streamReader.close(); 39.} catch (Exception e) { 40.System.out.println("Error handling a client: " + e); 41.} 42.} 43.public void run() { 44.try { 45.PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream()); 46.BufferedReader streamReader = 47.new BufferedReader(new InputStreamReader(socketToHandle.getInputStream())); 48.String fileToRead = streamReader.readLine(); 49.BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead)); 50.String line = null; 51.while ((line = fileReader.readLine()) != null) 52.streamWriter.println(line); 53.fileReader.close(); 54.streamWriter.close(); 55.streamReader.close(); 56.} catch (Exception e) { 57.System.out.println("Error handling a client: " + e); 58.} 59.} |
ConnectionHandler的 run() 方法所做的事情就是 RemoteFileServer 上的 handleConnection() 所做的事情。首先,我們把 InputStream 和 OutputStream 分別包裝(用 Socket 的 getOutputStream() 和 getInputStream() )進(jìn) BufferedReader 和 PrintWriter 。然后我們用這些代碼逐行地讀目標(biāo)文件:
Java代碼
60.FileReader fileReader = new FileReader(new File(streamReader.readLine())); 61.BufferedReader bufferedFileReader = new BufferedReader(fileReader); 62.String line = null; 63.while ((line = bufferedFileReader.readLine()) != null) { 64.streamWriter.println(line); 65.} 66.FileReader fileReader = new FileReader(new File(streamReader.readLine())); 67.BufferedReader bufferedFileReader = new BufferedReader(fileReader); 68.String line = null; 69.while ((line = bufferedFileReader.readLine()) != null) { 70.streamWriter.println(line); 71.} |
請記住我們應(yīng)該從客戶機(jī)獲取一條有效的文件路徑,這樣用該路徑名構(gòu)造一個(gè)新 File ,把它包裝進(jìn) FileReader 以處理讀文件的操作,然后把它包裝進(jìn) BufferedReader 以讓我們逐行地讀該文件。我們在 Java while循環(huán)語句中調(diào)用 BufferedReader 上的 readLine() 直到不再有要讀的行。請記注,對 readLine() 的調(diào)用將造成阻塞,直到有字節(jié)來到為止。我們獲取一些字節(jié)之后就把它們放到本地的 line 變量中,然后寫出到客戶機(jī)上。完成讀寫操作之后,我們關(guān)閉打開的流。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載