2012年12月14日 星期五

第十四週計算機網路

作業1:說明Link state rooling algorigrithm出現的oscilation problem解決方法


利用Dijkstra algorithm來計算:
初始化:
     N' ={u}
 對於所有的節點v
 如果v是u的相鄰節點
 則 D(v) = c(u,v)
 否則 D(v) = 無限大

loop:
 尋找不屬於N'的w,使D(w)最小
 將w加入N'
 更新所有不屬於N’的相鄰節點v的D(v)
 前往v的新成本,會是前往v的舊成本,或是已知前往w的最小路徑加上從w前往v地成本
    直到N' = N

給定n個節點,最糟狀況的複雜度為O(n^2)

如果連結成本等於連結負載,可能會碰上震盪!
解決方法: 確保所有router不要同時執行LS演算法
=> 執行最後會同步!!
避免同步 => 每個router隨機選擇時間送出通告

作業2:說明Distance vector rooting alorigrithm出現的bad news travel slow解決方法

初始化:
 對所有屬於N的目的端y:
     如果y不是相鄰節點,則c(x,y)等於無限大
 對於每個相鄰節點w
  對所有屬於N的目的端y,Dw(y)等於無限大
 對於每個相鄰節點w
  送出距離向量Dx = [Dx(y): y屬於N] 給w

迴圈
  等待:直到我看見某個相鄰節點w的連結成本改變,或是直到我收到來自某個相鄰節點w的距離向量
  對於所有屬於N的y:
  Dx(y) = min{c(x, v) + Dv(y)}
  如果有任何目的端y的Dx(y)改變了
  送出距離向量Dx = [Dx(y): y屬於N]給所有相鄰節點
        永遠執行下去

DV演算法是分散式的

網路直徑: 從一個node到另一個node的最長距離
DV需要至少(網路直徑)的時間才會收斂

因為每一網路節點不需掌握網路整體拓撲,因此在選徑時就有可能會有形成迴圈的現象

,甚至有可能會使得路徑的選擇產生無限計數(Count to infinity)的問題


解決無限計數的方法
Maximum hop count:限制其跳躍數
Split horizon:這個方法的原則是不回送資料,所以當A-B之間斷了,C不會再把A的訊息告訴B,因為到A的訊息是由B告訴C的
Hold Down: 利用Hold down timer,若hold down timer過期前的任何時間裡,從不同的路由器接到更新資訊,但指標較差,則不理會更新資訊。在hold down timer時效範圍內,不理會指標較差的更新資訊,則能有更多時間將中斷的改變資訊傳播到整個網路上。


筆記:







2012年11月30日 星期五

第十一週計算機網路

作業:
1.解釋3-way handshaking
三向交握 (Three-way handshake)

TCP 通訊協定是一種 connection-oriented 協定,它在實際資料傳送前,會在來源端與目的端主機以三向交握 (three-way handshake) 的方式先建立連線,所有屬於相同訊息的 TCP 封包,就利用此連線傳送,此種作法有助於資料傳輸的正確性。以下是三向交握的流程說明:
 
 
(1) 當傳送端想要與接收端連線時,同時會啟用一個大於 1023 的通訊埠作為溝通的介面,並且送出一個要求連線的 SYN 封包,此封包內帶有起始序號 (例如 100)。
(2) 接收端確認收到連線的 SYN 封包後,會回送一個 SYN+ACK 封包給傳送端,封包內則帶有回應號碼 (連線 SYN 封包的序號 + 1),以及接收端的起始序號 (例如 2200),等待傳送端的回應確認。
(3) 當傳送端收到來自接收端的回應號碼,確認之前的連線要求封包已被收到,便會再傳送一個 ACK 封包給接收端,封包內會帶有回應號碼 (SYN+ACK 封包的序號 + 1)。
 
待接收端收到帶有正確回應號碼的 ACK 封包,此連線便正式建立。在 TCP 封包內,有 8 個控制位元 (Control bits 或 Flags) 用來代表封包的主要動作:
 
Flags說    明
CWR
CWR (Congestion Window Reduced) flag 為 1 代表接到 ECE 旗標 為 1 的 TCP 封包。
ECEECE (ECN-Echo) flag 為 1 代表 TCP peer (對等體) 具備 ECN (Explicit Congestion Notification, 明確擁塞通知) 功能,同時 IP 封包中的 ECN 欄位被設定為 11。
URGURG (Urgent) flag 為 1 代表緊急封包,接收端應優先處理。
ACKACK (Acknowledgment) flag 為 1 代表此封包的 Acknowledgment Number 是有效的﹐是用來回應上一個封包。
PSHPSH (Push function) flag 為 1 代表此封包連同緩衝區的其它相關封包應立即進行傳送,而無需等待緩衝區滿了才送。
RSTRST (Reset) flag 為 1 代表馬上結束連線,無需等待終止確認手續。
SYNSYN (Synchronize) flag 為 1 代表要求雙方進行同步處理,也就是要求建立連線。
FINFIN (Finish) flag 為 1 代表資料傳送結束,等待結束回應,以便正式結束 TCP 傳送流程。
 
2.解釋ping
ping:一個電腦網路工具,用來測試特定主機能否通過IP到達。ping的運作原理是:向目標主機傳出一個ICMPecho要求封包,等待接收echo回應封包。程式會按時間和反應成功的次數,估計失去封包率(丟包率)和封包來回時間(網路時延)(Round-trip delay time)。

何謂ICMP:
網際網路控制消息協議Internet Control Message Protocol 或簡寫 ICMP)是網路協議族的核心協議之一。它用於 TCP/IP 網路中發送控制消息,提供可能發生在通信環境中的各種問題反饋,通過這些信息,令管理者可以對所發生的問題作出診斷,然後採取適當的措施解決。
ICMP [1] 依靠IP來完成它的任務,它是IP的主要部分。它與傳輸協議,如TCPUDP顯著不同:它一般不用於在兩點間傳輸數據。它通常不由網路程序直接使用,除了pingtraceroute這兩個特別的例子。

筆記:



2012年11月8日 星期四

第八週計算機網路

作業:
1:說明RS-232
RS-232 (Recommended Standard-232) 是由電子工業協會(Electronic Industries Association,EIA) 所制定的非同步傳輸(asynchronous transmission) 標準介面。

這也是許多個人電腦上的通訊介面之一,在IBM-PC 上,一般電腦 
可連接二至四個 RS-232 介面。一般又稱此介面為『序列埠』或『串列埠』(serial port),由於 RS-232 是由 EIA 所定義的,所以也常稱為 EIA-232,目前演進到第四代 RS-232D。 
通常 RS-232 介面以九個接腳 (DB-9) 或是二十五個接腳 (DB-25)的型態出現,一般個人電腦上會有兩組 RS-232 介面,分別稱為 COM1 和 COM2;此外,還可以連接 COM3 及 COM4,不過因為 COM1/COM3 共用 IRQ 4,而COM2/COM4 共用 IRQ 3,所以同時最多只能使用四個 COM ports 的其中兩個。

此介面通常用來連接數據機、序列滑鼠 (PS/2 滑鼠不佔用 COM port)、條碼機 、簡單的工業控制組件、串列埠列表機(一般印表機只支援傳輸速度較快的平行埠傳輸),但是因為序列傳輸是每次傳送一個位元,比平行埠傳輸 (一次傳送八個位元) 要慢許多,因此連接其它電腦和印表機的工作大多由平行埠來代替。

2.用筆記上的end-to-end與point-to-point的圖,利用該圖的概念找出實際例子

end-to-end :間接相連(跨網路相連)






應用:SSL/TLS
安全套接層Secure Sockets LayerSSL)是網景公司(Netscape)在推出Web瀏覽器首版的同時提出的協議。SSL採用公開密鑰技術,保證兩個應用間通信的保密性可靠性,使客戶與伺服器應用之間的通信不被攻擊者竊聽。可在伺服器和客戶機兩端同時實現支持,目前已成為網際網路上保密通訊的工業標準,現行Web瀏覽器亦普遍將HTTP和SSL相結合,從而實現安全通信。此協議和其繼任者傳輸層安全Transport Layer SecurityTLS)是為網路通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網路連接進行加密。

point-to-point:
直接相連(實體相連)







應用:P2P


群對群技術(peer-to-peer, 簡稱P2P)又稱對等網際網路技術,是一種網路新技術,依賴網路中參與者的計算能力和頻寬,而不是把依賴都聚集在較少的幾台伺服器上。請注意與point-to-point之間的區別,peer-to-peer一般譯為端對端或者群對群,指對等網中的節點;point-to-point一般譯為點對點,對應於普通網路節點。P2P網路通常用於透過Ad Hoc連線來連線節點。這類網路可以用於多種用途,各種檔案分享軟體已經得到了廣泛的使用。P2P技術也被使用在類似VoIP等即時媒體業務的資料通訊中。
純點對點網路沒有客戶端或伺服器的概念,只有平等的同級節點,同時對網路上的其它節點充當客戶端和伺服器。這種網路設計模型不同於客戶端-伺服器模型,在客戶端-伺服器模型中通訊通常來往於一個中央伺服器。


3.解釋Encapsulation
封裝(Encapsulation)是物件導向中四大特色之一,簡單來說封裝就是適度的將資訊隱藏(Information Hiding),避免外界不當使用。在抽象化的過程,善加將定義類別中的屬性跟方法封裝,有利於日後系統維護時造成的許多不必要的問題喔。

為什麼需要將資料隱藏或加以封裝?
舉一個例子:一個Person的類別中,若有一屬性為心跳,如果今天心跳沒有宣告成private(即類別獨自私有,外界不得使用),代表外界可以直接取得某人的心跳屬性,如此當我在某天跟你吵架我就直接取用你的心跳屬性特定:setHeart(0),那恭喜你,你得躺平囉!由此應該可以感受到適度進行封裝的效用了吧~

封裝手法:提供受控制的間接操作取代不受控制的直接存取。在系統中最怕的就是不受控制的狀態發生,這對日後的維護非常頭疼,邏輯錯誤在龐大的程式當中要找出來,有時還真的像是大海撈針。如何避免這種不必要的問題發生,我想適度封裝是一個不錯的解決方案喔,舉例而言:若有一個Person的類別,當中有身高、體重兩個屬性,若不將他們宣告成private,那外部類別可以直接取得並設定如下,試想身高設定成-100是什麼樣的狀況又是否合理?但只要你允許外面存取,就無法保證外界是否會對你的屬性做此類愚蠢的設定。

身高 = -100;

針對上述該如何處理呢?建議作法如下:

        private 身高;

        public boolean set身高(int h) {

          if(h<0) return false;

          else 身高 = h;
        }

我們可以藉由將身高封裝,並提供一個外部的設定管道,然而此管道是可受控制的,如此必可確保身高的設定不會有不合邏輯的情況發生。

封裝最主要的兩個優勢:
避免不必要的資料存取現象發生。利用封裝可以適度的將資料進行適度資訊隱藏。如此避免不必要的存取,進而發生問題。
適度將製作細節封裝可以降低ripple effect(漣波效益),避免日後修改一問題所帶來的連帶效應過大。如此在日後可增加系統的可擴充性、易維護性。對維修工程師將是一大福音喔~


筆記:



2012年10月29日 星期一

第七週計算機網路

作業:
1. cookie隱私權問題

Cookie(複數形態Cookies),中文名稱為小型文字檔案小甜餅,指某些網站為了辨別使用者身份而儲存在用戶端(Client Side)上的資料(通常經過加密)。

隱私,安全和廣告

Cookies在某種程度上說已經嚴重危及使用者的隱私安全。其中的一種方法是:一些公司的高層人員為了某種目的(譬如市場調查)而存取了從未去過的網站(透過搜尋引擎查到的),而這些網站包含了一種叫做網頁臭蟲的圖片,該圖片透明,且只有一個象素大小(以便隱藏),它們的作用是將所有存取過此頁面的電腦寫入cookie。而後,電子商務網站將讀取這些cookie訊息,並尋找寫入這些cookie的網站,隨即發送包含了針對這個網站的相關產品廣告的垃圾郵件給這些高階人員。

[编辑]竊取Cookies和指令碼攻擊

雖然cookies沒有中電腦病毒那麼危險,但它仍包含了一些敏感訊息:使用者名,電腦名,使用的瀏覽器和曾經存取的網站。使用者不希望這些內容泄漏出去,尤其是當其中還包含有私人訊息的時候。
這並非危言聳聽,一種名為Cross site scripting的工具可以達到此目的。在受到Cross site scripting攻擊時,cookie盜賊和cookie毒藥將竊取內容。一旦cookie落入攻擊者手中,它將會重現其價值。
  • Cookie盜賊:搜集使用者cookie並行給攻擊者的駭客。攻擊者將利用cookie訊息透過合法手段進入使用者帳戶。
  • Cookie投毒:一般認為,Cookie在儲存和傳回伺服器期間沒有被修改過,而攻擊者會在cookie送回伺服器之前對其進行修改,達到自己的目的。例如,在一個購物網站的cookie中包含了顧客應付的款項,攻擊者將該值改小,達到少付款的目的。這就是cookie 投毒。


2. 找CS,P2P數據,畫圖解釋                                                                                               

筆記:





2012年10月23日 星期二

第六週計算機網路

作業:
1.舉例:解釋說明執行FTP的過程/運作流程(commands, status code / phrase)

FTP 常用指令說明:

    ls     查看 Server 端的目錄或檔案

    pwd    查看 Server 端目前所在的目錄

    cd     變更 Server 端目前的目錄

    cdup   變更 Server 端目前的目錄到上一目錄

    lls    查看 Local 端的目錄或檔案

    lcd    變更 Local 端目前的目錄

    asc    設定傳輸模式為文字檔方式

    bin    設定傳輸模式為二進位檔方式
    get    將 Server 端的檔案拷貝至 Local 端現在目錄下

    mget   拷貝多個 Server 端的檔案至 Local 端現在目錄下

    put    將 Local 端的檔案拷貝至 Server 端現在目錄下

    mput   拷貝多個 Local 端的檔案至 Server 端現在目錄下

    delete 刪除 Server 端的檔案

    mkdir  在 Server 端建立目錄

    rmdir  刪除 Server 端的目錄

    !      shell 指令

    !ls    查看 Local 端的目錄或檔案

    prompt 變換交談模式 (on/off),

    ?,help 指令使用說明

    bye    結束 FTP


    下表是 FTP 的命令列表,可用 help 指令查詢用法:

    !               cr              macdef          proxy           send
    $               delete          mdelete         sendport        status
    account         debug           mdir            put             struct
    append          dir             mget            pwd             sunique
    ascii           disconnect      mkdir           quit            tenex
    bell            form            mls             quote           trace
    binary          get             mode            recv            type
    bye             glob            mput            remotehelp      user
    case            hash            nmap            rename          verbose
    cd              help            ntrans          reset           ?
    cdup            lcd             open            rmdir
    close           ls              prompt          runique


STATUS CODE:
1xx -肯定的初步答复這些狀態代碼指示一項操作已經成功開始,但客戶端希望在繼續操作新命令前得到另一個答复。 
110 重新啟動標記答复。 
120 服務已就緒,在nnn 分鐘後開始。 
125 數據連接已打開,正在開始傳輸。 
150 文件狀態正常,準備打開數據連接。 
2xx -肯定的完成答复 <br>一項操作已經成功完成。客戶端可以執行新命令。 ? 200 命令確定。 
202 未執行命令,站點上的命令過多。 
211 系統狀態,或系統幫助答复。 
212 目錄狀態。 
213 文件狀態。 
214 幫助消息。 
215 NAME 系統類型,其中,NAME 是Assigned Numbers 文檔中所列的正式系統名稱。 
220 服務就緒,可以執行新用戶的請求。 
221 服務關閉控制連接。如果適當,請註銷。 
225 數據連接打開,沒有進行中的傳輸。 
226 關閉數據連接。請求的文件操作已成功(例如,傳輸文件或放棄文件)。 
227 進入被動模式(h1,h2,h3,h4,p1,p2)。 
230 用戶已登錄,繼續進行。 
250 請求的文件操作正確,已完成。 
257 已創建“PATHNAME”。 
3xx -肯定的中間答复 <br>該命令已成功,但服務器需要更多來自客戶端的信息以完成對請求的處理。 331 用戶名正確,需要密碼。 
332 需要登錄帳戶。 
350 請求的文件操作正在等待進一步的信息。 
4xx -瞬態否定的完成答复 <br>該命令不成功,但錯誤是暫時的。如果客戶端重試命令,可能會執行成功。 
421 服務不可用,正在關閉控制連接。如果服務確定它必須關閉,將向任何命令發送這一應答。 
425 無法打開數據連接。 
426 Connection closed; transfer aborted. 
450 未執行請求的文件操作。文件不可用(例如,文件繁忙)。 
451 請求的操作異常終止:正在處理本地錯誤。 
452 未執行請求的操作。系統存儲空間不夠。 
5xx -永久性否定的完成答复 <br>該命令不成功,錯誤是永久性的。如果客戶端重試命令,將再次出現同樣的錯誤。 
500 語法錯誤,命令無法識別。這可能包括諸如命令行太長之類的錯誤。 
501 在參數中有語法錯誤。 
502 未執行命令。 
503 錯誤的命令序列。 
504 未執行該參數的命令。 
530 未登錄。 
532 存儲文件需要帳戶。 
550 未執行請求的操作。文件不可用(例如,未找到文件,沒有訪問權限)。 
551 請求的操作異常終止:未知的頁麵類型。 
552 請求的文件操作異常終止:超出存儲分配(對於當前目錄或數據集)。 
553 未執行請求的操作。不允許的文件名。 
常見的FTP狀態代碼及其原因 ? 
150 - FTP使用兩個端口:21用於發送命令,20用於發送數據。狀態代碼150 表示服務器準備在端口20 上打開新連接,發送一些數據。 
226 - 命令在端口20 上打開數據連接以執行操作,如傳輸文件。該操作成功完成,數據連接已關閉。 
230 - 客戶端發送正確的密碼後,顯示該狀態代碼。它表示用戶已成功登錄。 
331 - 客戶端發送用戶名後,顯示該狀態代碼。無論所提供的用戶名是否為系統中的有效帳戶,都將顯示該狀態代碼。 
426 - 命令打開數據連接以執行操作,但該操作已被取消,數據連接已關閉。 
530 - 該狀態代碼表示用戶無法登錄,因為用戶名和密碼組合無效。如果使用某個用戶帳戶登錄,可能鍵入錯誤的用戶名或密碼,也可能選擇只允許匿名訪問。如果使用匿名帳戶登錄,IIS 的配置可能拒絕匿名訪問。 
550 - 命令未被執行,因為指定的文件不可用。例如,要GET 的文件並不存在,或試圖將文件PUT 到您沒有寫入權限的目錄。


FTP(File Transfer Protocol) 是目前 Internet 中最常使用來作為傳輸檔案的方法。它與 Web 伺服器一樣,都是使用 TCP 為傳輸時的通訊協定,因此能提供較可信賴的連接導向(Connection-Oriented)傳輸。

FTP 運作流程圖

FTP 伺服器和用戶端電腦資料交換的過程如下三圖所示
階段一 監聽階段二 連接階段三 傳遞
階段一 監聽階段二 連接階段三 傳遞

FTP 運作流程說明

  1. 戶端使用 Three-Way Handshake與 FTP 伺服器端建立 TCP 交談。
  2. FTP伺服器利用 TCP 21 連接埠來傳送和接收 TCP 控制資訊,以便於傾聽用戶端的連線要求,在連線建立後,此連接埠會全程開啟。
  3. FTP伺服器使用 TCP 20 連接埠來傳送與接收 FTP 檔案,傳送完成後即關閉。
  4. 用戶端在向 FTP 伺服器提出連線要求後,會在 1024 ~ 65535 的連接埠中動態指定一個連接埠。並以此動態連接埠與 FTP 伺服器上的 TCP 21 連接埠來建立交談。
  5. 用戶端會開啟另一連接埠連到 FTP 伺服器上的 TCP 20 連接埠,以便傳輸資料。而且每一次有檔案要傳輸時,用戶端會開啟一個新的連接埠與FTP伺服器連線。
(補)2.說明Recursive和iterative的差異性
iterative:「疊代法」是把求得的數值,不斷重覆代入,再求得新數值的方法。
recursive:「遞迴法」是重複用相同手段來縮減問題範圍的方法。

比較 Iterative Method 與 Recursive Method
疊代法以確定的部分作為起始點,循序漸進推演,最後求得答案。
遞迴法找出一套縮小問題範疇的規律,以此規律不斷縮小問題,直到能釐清細節,找到確定的部份。
疊代法與遞迴法恰好顛倒:疊代法是針對已知,逐步累積,直至周全;遞迴法是針對未知,反覆拆解,直至精細。

筆記:
















2012年10月18日 星期四

第五週計算機網路

(補)作業:
搜尋html主程式呼叫另一html副程式的程式,並解釋說明之

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="http://connect.facebook.net/zh_TW/all.js"></script>
    <title>My Facebook Login Page</title>
    <script type="text/javascript">
        // 初始化 & 登入
        function oplogin() {
            FB.init({ appId: '你的app id', status: true, cookie: true, xfbml: true, channelUrl: 'http://www.你的Domain.com.tw/channel.html' }); //appid請去FB申請應用程式
            fblogin();
        }
        function fblogin() {
            FB.login(function (response) {
                if (response.authResponse) {
                    //登入成功
                    FB.api('/me', function (response) {
                        var html = '<table>';
                        for (var key in response) {
                            html += ('<tr>' + '<th>' + key + '</th>' + '<td>' + response[key] + '</td>' + '</tr>');
                        }
                        document.getElementById('me').innerHTML = html + '</table>';
                    });
                }
                else {
                    //登入失敗
                    alert("登入失敗。");
                }
            });
        }
        //登出
        function fblogout() {
            FB.getLoginStatus(function (response) {
                if (response.status === 'connected') {
                    FB.logout(function (response) {
                        // user is now logged out
                        document.getElementById('loginform').submit();
                    });
                } else if (response.status === 'not_authorized') {
                    // the user is logged in to Facebook,
                    // but has not authenticated your app
                    FB.logout(function (response) {
                        // user is now logged out
                        alert("請重新登入!");
                    });
                } else {
                    // the user isn't logged in to Facebook.
                    alert("請重新登入!");
                }
            });
        }
    </script>
</head>
<body>
    <input type="button" id="btn2" onclick="javascript:oplogin();return false;" value="取得Facebook登入者資訊(PartII)" />
    <div id="me">
    </div>
</body>
</html>



試描述web cache/proxy server所遇到的update problem

什麼是 Proxy ?
Proxy 在字面上的意思是代理人(所以亦可稱作代理伺服器)
Proxy伺服器可以接受使用者的要求至 Internet 上抓取網頁,當抓到網頁資料時,它會將網頁資料複製一份存放在自己的硬碟裡,再將網頁資料傳送給提出要求的使用者。
當有另一位使用者要求讀取同一份網頁資料時,Proxy 伺服器即可將存放於硬碟上的網頁資料傳送給另一位使用者。這樣一來,便可以省下可貴的頻寬給真正有需要的人使用



Proxy 的運作
(1) 使用者 User (Client) 提出要求
(2) Proxy Server本身是否有所需資料,若有則跳至(6)
(3) 向真正的 Web Server 提出索取資料需求
(4) 真正的 Web Server 回應資料
(5) Proxy Server 儲存 WebServer 回應的資料
(6) Proxy 回應使用者 (Client) 需求
使用 Proxy Server 的好處
1.減少不必要的傳輸, 降低網路的負載
2.加快擷取網頁的速度, 減少等待的時間
3.提供使用防火牆的區域網路連上 Internet 的方法

update problem:
可能會取得舊的錯誤資料:這個最容易發生了!由於曾經瀏覽過的網頁會被放置到快取, 並提供後續用戶的直接取得。萬一網際網路上面的那個網頁資料更新過呢?那時你會發現,怎麼用戶端無法看到更新後的資料? 就是因為快取的問題啊!取得舊資料的頻率可能會很高啊!
筆記:




2012年10月10日 星期三

第四週計算機網路

作業:
1. 撰寫程式
開啟主程式輸入10筆資料交由副程式排序,排序後在交由主程式印出
Source code:
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include <iostream>
using namespace std;
void bubble(int data[]);
int _tmain(int argc, _TCHAR* argv[])
{
int data[10];
for(int i=0;i<10;i++)
scanf_s("%d",&data[i]);
bubble(data);
for(int j=0;j<10;j++)
printf("%d ",data[j]);
system("pause");
return 0;
}
void bubble(int data[])
{
int i,j,temp;
for( i=1;i<10;i++)
for( j=0;j<(10-i);j++)
if(data[j]>data[j+1])
{
temp=data[j];
data[j]=data[j+1];
data[j+1]=temp;
}
}
執行結果:



2. 程式說明
搜尋任一socket program,並解釋說明之

socket:
Linux作業系統使用socket觀念來設計網路程式,
socket 是一種可做雙向資料傳輸的通道,Linux程序可經由此裝置與本地端或是遠端的程序做溝通。
Linux socket分成unix-domain socket和internet-domain socket二種。unix-domain socket又稱為local socket,主要用來與本地端的程序溝通。internet-domain socket用來與遠地端的程序溝通。
socket programming:
1.有server&client兩端
2.server只有一個,而client可能有多個
3.server可設定監聽(listen)port number
socket program範例:

  • Server.java
package onlyfun.caterpillar;

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) { 
        try { 
            int port = Integer.parseInt(args[0]);
            System.out.println("簡易檔案接收..."); 
            System.out.printf("將接收檔案於連接埠: %d%n", port); 

            ServerSocket serverSkt = new ServerSocket(port); 
            
            while(true) { 
                System.out.println("傾聽中...."); 
                
                Socket clientSkt = serverSkt.accept();
                
                System.out.printf("與 %s 建立連線%n", 
                        clientSkt.getInetAddress().toString());  
                
                // 取得檔案名稱
                String fileName = new BufferedReader(
                                    new InputStreamReader(
                                      clientSkt.getInputStream())).readLine();
                
                System.out.printf("接收檔案 %s ...", fileName); 

                BufferedInputStream inputStream = 
                    new BufferedInputStream(clientSkt.getInputStream()); 
                BufferedOutputStream outputStream = 
                    new BufferedOutputStream(new FileOutputStream(fileName)); 
                
                int readin; 
                while((readin = inputStream.read()) != -1) { 
                    outputStream.write(readin);
                    Thread.yield();
                } 

                outputStream.flush();
                outputStream.close();                
                inputStream.close(); 
                
                clientSkt.close(); 
                
                System.out.println("\n檔案接收完畢!"); 
            } 
        } 
        catch(Exception e) { 
            e.printStackTrace(); 
        } 
    }     
}

再來是客戶端程式: 

  • Client.java
package onlyfun.caterpillar;

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {        
        try { 
            System.out.println("簡易檔案傳送..."); 

            String remoteHost = args[0];
            int port = Integer.parseInt(args[1]);
            File file = new File(args[2]); 
            
            System.out.printf("遠端主機: %s%n", remoteHost); 
            System.out.printf("遠端主機連接埠: %d%n", port);
            System.out.printf("傳送檔案: %s%n", file.getName());

            Socket skt = new Socket(remoteHost, port); 

            System.out.println("連線成功!嘗試傳送檔案....");

            PrintStream printStream = 
                new PrintStream(skt.getOutputStream()); 
            printStream.println(file.getName()); 

            System.out.print("OK! 傳送檔案...."); 
            
            BufferedInputStream inputStream = 
                new BufferedInputStream( 
                        new FileInputStream(file)); 

            int readin; 
            while((readin = inputStream.read()) != -1) { 
                 printStream.write(readin); 
                 Thread.yield();
            } 

            printStream.flush();
            printStream.close();
            inputStream.close(); 
            
            skt.close();
            
            System.out.println("\n檔案傳送完畢!"); 
        } 
        catch(Exception e) { 
            e.printStackTrace(); 
        } 
    } 
}



筆記: