1. 程式人生 > >P2P模式檔案傳輸網路應用的開發

P2P模式檔案傳輸網路應用的開發

_

我設計的p2p系統包括使用者登入模組、註冊資源模組、下載資源模組;

服務端維護使用者和資源資訊,包括兩張表(如下),其中src_name儲存的是資源在註冊使用者機器上的絕對路徑;

User

+-------+-------------+------+-----+---------+-------+

| Field | Type        | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| ip    | varchar(20) | NO   | PRI | NULL    |       |

| port  | varchar(10) | YES  |     | NULL    |       |

| stat  | varchar(3)  | YES  |     | NULL    |       |

+-------+-------------+------+-----+---------+-------+

Src

+----------+--------------+------+-----+---------+-------+

| Field    | Type         | Null | Key | Default | Extra |

+----------+--------------+------+-----+---------+-------+

| ip       | varchar(20)  | YES  |     | NULL    |       |

| src_name | varchar(50)  | YES  |     | NULL    |       |

| src_path | varchar(300) | YES  |     | NULL    |       |

+----------+--------------+------+-----+---------+-------+

客戶端擁有使用者圖形介面,使用者登入時需要填寫伺服器IP、伺服器PORT和本機監聽PORT;註冊資源時需要選擇檔案、填寫資源名稱;下載檔案時需要填寫查詢的資源名稱和檔案監聽PORT。

客戶端-->伺服器的協議形式:IP(客戶自己的)+PORT(客戶自己的)+act+src_name+src_path;其中act包括:login/logoff/upload/download/query;

伺服器-->客戶端的協議形式:resp – ip(其他結點的)+port(其他結點的)+src_name+src_path - …… - …… - ;其中resp為伺服器返回給客戶端的狀態碼,以便於客戶端根據狀態碼進行處理和顯示,包括:login_ok/logoff_ok/upload_ok/query_result/query_null/p2p;

PàP之間的協議形式:resp – ip(客戶自己的) – port(客戶自己的檔案監聽埠) – src_name – src_path;其中resp為p2p;

使用流程:使用者輸入伺服器IP、伺服器PORT和本機監聽PORT後,點選上線按鈕(有預設值),如果資訊不完全或者連線有問題會彈出警示框;點選上線按鈕後,其他功能模組的按鈕才可以使用,即不再顯示灰色,伺服器IP、伺服器PORT和本機監聽PORT三個文字框不可編輯;

使用者點選瀏覽,會彈出檔案選擇框,選擇要上傳的檔案,確定後,文字框中顯示出選中檔案的路徑和檔名,填寫資源命名,如果為空彈出警示框;

如果使用者希望下載資源,則在下載資源模組中輸入資源名稱,點選查詢,如果有資源,則顯示在下面的列表框中,使用者選中希望下載的資源,再填寫檔案監聽PORT,點選下載,會彈出資料夾選擇框,確認後,開始下載,下載完成會提示使用者,如果下載有問題,也會彈出相應警示框,如果沒有資源,則列表框為空,並彈出警示框,告知使用者無資源。

使用者點選下線按鈕後,其他可用的按鈕變為不可用,除了上線按鈕,並且伺服器IP、伺服器PORT和本機監聽PORT三個文字框可編輯。

1.       檔案型別

我發現java project編寫socket網路檔案傳輸,只要以txt文字儲存都正常,而其他型別就會丟資料,導致下載的檔案不完整;於是我想到了一個辦法:將其他型別的檔案作為txt型別下載下來,然後再進行型別轉換成原有型別,刪掉用於轉換的txt臨時檔案;因為伺服器已經反饋給客戶端檔案的絕對路徑和檔名了,所以客戶端可以判斷檔案型別,是否需要進行格式轉換和轉換為何種型別。

2.       java寫介面太麻煩

因為大二的時候用過socket程式設計,所以就在原來工程的基礎上進行改動,改動很大,但是為了有原型可以參照,便還是使用java編寫圖形介面,但是確實很麻煩。

3.       使用者非正常退出

這個問題目前沒有解決,只提供了點選下線按鈕,正常下線功能,原理是刪除user表中的IP,使其他使用者看不到該使用者的資源。

4.       使用者標識和資源存放問題

因為IP並不是和每臺機器是一對一關係,所以用IP作為使用者標識,並不是很合理;而且我實現的伺服器維護的是資源在使用者機器上的絕對路徑,並沒有考慮好如何能唯一標識一臺機器;如果把資源上傳到伺服器,會增大伺服器的負擔,這樣也不是p2p形式了;現在這種情況就是說,如果使用者機器的IP改變,使用者再登入系統,之前上傳的資源就全部作廢,除非使用原來的IP,而且絕對路徑還不能變,會造成很大的侷限性;所以這個部分在使用者體驗上還有很大的問題。

 5.還有很重要的一條:各種流啊socket啥的,沒用了記得close…否則會崩:被佔用…

最後程式碼不傳了,我怕別人用著用著就崩了,還是本著優生優育的原則吧,工程名p2p_exp4,eclipse開啟,mark一下,有心情再改改吧……不過註定也是個有進步的豆腐渣工程……