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一下,有心情再改改吧……不過註定也是個有進步的豆腐渣工程…… |