Java實現簡單的FTP伺服器
前言
學習了Java網路程式設計了,為了檢驗自己的學習程式和熟悉相關的知識點,為此,使用Java Socket程式設計實現了一個簡單的FTP伺服器。以下記錄了自己整個開發的流程。
FTP協議
自己平時也有用過ftp協議進行檔案的傳輸,知道FTP協議的預設埠是21,可對於底層是如何實現,客戶端與服務端之間的通訊時如何進行的並不是瞭解,為此,專門查看了TCP/IP詳解協議卷中對FTP的描述,理解FTP的工作機制。
工作機制概要
FTP是檔案傳輸協議,與大多數其他的TCP應用不同,它在客戶程序和伺服器程序之間使用兩個TCP連線,一個控制連線,預設使用TCP的21埠,它一直持續到客戶程序與服務程序之間的通訊完成為止,另一個按需可以隨時建立和撤銷的資料連線,用於資料傳輸,這條TCP連線是按照與控制用的連線相反的方向建立的,即客戶端建立ServerSocket,而服務端建立Socket,而檔案傳輸的處理過程如下:
資料表示
FTP協議規範提供了控制檔案傳送與儲存的多種選擇。在以下四個方面中的每一個方面須作出一個選擇。
1. 檔案型別
1. ASCII碼檔案型別(預設選擇)文字檔案已NVT ASCII碼形式在資料連線中傳輸。這要求發方將本地文字檔案轉換成NVT ASCII碼形式,而收方則將NVT ASCII碼再還原成本地檔案。其中用於NVT ASCII碼傳輸的每行都帶有一個回車,而後是一個換行。這意味著收方必須掃描每個位元組,查詢CR、LF對。
2. EBCDIC檔案型別,該文字型別傳輸方式要求兩端都是EBCDIC系統
3. 影象檔案型別(也稱為二進位制檔案型別),資料傳送呈現為一個連線的位元流。通常用於傳輸二進位制檔案。
4. 本地檔案型別,該方式在具有不同位元組大小的主機間傳輸二進位制檔案。每一位元組的位元數由發方規定。對使用8bit位元組的系統來說,本地檔案以8bit位元組傳輸就等同於影象檔案傳輸。
2. 格式控制,該選項只對ASCII和EBCDIC檔案型別有效
1. 非列印(預設選擇),檔案中不含有垂直格式資訊
2. 遠端登入格式控制,檔案含有向印表機解釋的遠端登入垂直格式控制。
3. Fortran回車控制,每行首字元是Fortran格式控制符。
3. 結構
1. 檔案結構(預設選擇),檔案被認為是一個連續的位元組流。不存在內部的檔案結構
2. 記錄結構,該結構只用於文字檔案(ASCII或EBCDIC)
3. 頁結構,每頁都帶有頁號傳送,以便收方能隨機地儲存各頁。該結構由TOPS-20作業系統提供
4. 傳輸方式,主要規定檔案在資料連線中如何傳輸。
1. 流方式(預設選擇),檔案以位元組流的形式傳輸。對於檔案結構,發方在檔案尾提示關閉資料連線。對於記錄結構,有專用的兩字序列碼標誌記錄結束和檔案結束。
2. 塊方式,檔案以一系列塊來傳輸,每塊前面都帶有一個或多個首部位元組。
3. 壓縮方式,一個簡單的全長的編碼壓縮方法,壓縮連續出現的相同位元組。在文字檔案中常用來壓縮空白串。
上述的內容,在實現簡單的FTP伺服器過程中,對於檔案型別中用於NVT ASCII碼傳輸的每行都帶有一個回車和換行,即CR、LF對這一點比較深刻,本人在實現檔案上傳指令STOR
時,伺服器傳輸回客戶端的開啟binary模式的響應150 open binary mode
時,遺漏了CR、LF對,導致服務端的socket讀取不到客戶端傳輸過來的二進位制資料。
FTP主要命令
指令 | 說明 |
---|---|
USER 使用者名稱 | 輸入使用者名稱 |
PASS 密碼 | 輸入密碼(PASSWORD) |
CWD 目錄名 | 修改工作目錄 |
QUIT | 正常結束 |
PORT h1,h2,h3,h4,p1,p2 | 指定資料傳輸時使用的IP地址和埠號 |
PASV | 不是從服務端向客戶端建立連線,而是由客戶端開始向伺服器建立資料傳輸使用者的連線 |
TYPE 型別名 | 設定傳送和接收的資料型別 |
STRU | 指定檔案結構 |
RETR 檔名 | 從FTP伺服器下載檔案 |
STOR 檔名 | 向伺服器上傳檔案 |
STOU 檔名 | 向伺服器傳送問價。當存在同名檔案時,為了避免衝突,適當地修改當前檔名後再上傳 |
APPE 檔名 | 向伺服器傳送檔案。當存在同名檔案時,將當前檔案內容追加到已有檔案 |
RNFR 檔名 | 指定RNTO之前要修改名稱的檔案 |
RNTO 檔名 | 修改由RNFR指定檔案的檔名 |
ABOR | 處理中斷,異常退出 |
DELE 檔名 | 從伺服器上刪除指定檔案 |
RMD 目錄名 | 刪除目錄 |
MKD | 建立目錄 |
PWD | 列出當前目錄位置 |
LIST | 檔案列表的請求(包括檔名、大小、更新日期等資訊) |
NLIST | 檔名一覽表請求 |
SITE 字串 | 執行伺服器提供的特殊命令 |
STAT | 顯示伺服器FTP的狀態 |
HELP | 命令幫助 |
NOOP | 無操作 |
響應資訊
響應狀態 | 說明 |
---|---|
提供資訊 | |
120 | Service ready is nnn min |
125 | Data connection already open;transfer starting |
150 | File status okay;about to open data connection |
連線管理相關應答 | |
200 | Command okay |
202 | Command not implemented,superfluous at this site |
211 | System status,or system help reply |
212 | Directory status |
213 | File status |
215 | NAME system type.Where NAME is an official system name from the list in the Assigned Numbers document. |
220 | Service ready for new user |
221 | Service closing control connection.Logged out if appropriate |
225 | Data connection open;no transfer in progress |
226 | Closing data connection.Requested file action successful |
227 | Entering Passive Model(h1,h2,h3,h4,p1,p2) |
230 | User logged in.proceed |
250 | Requested file okay,completed |
257 | “PATHNAME” created |
驗證與使用者相關應答 | |
331 | User name okay,need password |
332 | Need account for login |
350 | Requested file action pending further information |
不固定的錯誤 | |
421 | Service not available,closing control connection.This may be a reply to any command if the service knows it must shut down |
425 | Can’t open data connectioni |
426 | Connection closed;transfer aborted |
450 | Requested file atction not taken.File unavailable |
451 | Requested action aborted:local error in processing |
452 | Requested action not taken.Insufficient storage space in system |
檔案系統相關應答 | |
500 | Syntax error,command unrecognized |
501 | Syntax error in parameters or arguments |
502 | Command not implemented |
503 | Bad sequence fo commands |
504 | Command not implemented for that parameter |
530 | Not logged in |
532 | Need account for storing files |
550 | Requested action not taken.File unavailable |
551 | Requested action aborted:page type unknown |
552 | Requested file action aborted.Exceeded stroage allocation |
553 | Request action not taken.File name not allowed |
實踐過程
用於測試的ftp客戶端:windows自帶的ftp客戶端
實現的FTP命令
目前的版本已基本實現了USER、PASS、PORT、QUIT、RETR、PWD(對應Windows的ftp客戶端的XPWD)、CWD、STOR、QUIT、NLIST、LIST,後續將會繼續開發完善給伺服器。
實現思想
- 建立容量固定的執行緒池對控制連線進行處理
- 使用ServerSocket進行監聽,每個控制連線的請求到來之後,提交給執行緒池進行處理。
- 對於命令使用工廠方法模式進行設計,當需要新增新的命令時,只需要新增一個命令類,修改工廠方法,其餘模組不需要改動,可擴充套件性較好,符合開閉原則
遇到的問題
- 實現
STOR
命令時,無法從Socket中獲取客戶端上傳的檔案,其原因是返回的狀態碼中遺漏了CR、LF對。 - 實現首先需要PORT命令傳輸socket埠的命令時,如DIR,不知道客戶端會預設地傳送PORT命令傳輸Socket埠,以為是在客戶端中自行傳輸Socket埠,後來通過Debug命令的執行過程發現客戶端在傳送DIR命令前,會先發送PORT命令。
- 如何避免網路攻擊,提高伺服器的安全性,如DOS攻擊等(該問題暫時沒有解決)
注:以上是本人在實現FTP伺服器時的過程記錄,歡迎有興趣的同學評論或Email一起交流分享,Email地址:[email protected]。
相關推薦
基於Java實現簡單Http伺服器之一
本文將詳細介紹如何基於java語言實現一個簡單的Http伺服器,文中將主要介紹三個方面的內容:1)Http協議的基本知識、2)java.net.Socket類、3)java.net.ServerSocket類,讀完本文後你可以把這個伺服器用多執行緒的技術重新編
Java實現簡單的FTP伺服器
前言 學習了Java網路程式設計了,為了檢驗自己的學習程式和熟悉相關的知識點,為此,使用Java Socket程式設計實現了一個簡單的FTP伺服器。以下記錄了自己整個開發的流程。 FTP協議 自己平時也有用過ftp協議進行檔案的傳輸,知道FT
java+jsp程式碼實現從FTP伺服器上傳下載檔案
首先宣告一下。jsp從ftp伺服器上面下載檔案,有兩種方法1.直接給出檔案的地址 2.將檔案作為位元組流返回給瀏覽器 一 、先說第一種吧(這種發放很簡單)。 1.直接使用一個超連結:<a href='ftp://FTP使用者名稱:密碼@IP地址:埠號+ 後面是路徑 (
Java實現簡單的Socket伺服器與客戶端字串通訊(適合初學者閱讀)
近段時間,頻繁看到很多學生做畢業設計用到了Socket通訊技術,問題非常多,特寫一個小例子,希望對馬上畢業的同學有所幫助。如果希望學習的更加深入,需要掌握的知識有:面向物件、多執行緒、Socket通訊、IO流、異常處理 伺服器端程式碼: import java
Android與Java NIO實現簡單Echo伺服器與客戶端
上一篇用Java IO來做了個Demo,於是乎進一步,用Java NIO來做一個。NIO的優勢在於非阻塞。使用了Selector在一個執行緒裡進行輪詢,就能夠完成接入、收\發訊息的操作,不需要每建立一個連線都新啟動一個執行緒的方式。Server端程式碼:public clas
用Java實現簡單的檔案上傳伺服器和客戶端
/** * 使用TCP協議實現上傳功能的伺服器端 * 思路: * 新建ServerSocket * 等待客戶端連線 * 連線上後開啟子執行緒,把連接獲取的Socket傳給子執行緒 * 迴圈進行 * @author yajun * */ public class UploadServer {
使用Java實現簡單的Http伺服器
在Java中可以使用HttpServer類來實現Http伺服器,該類位於com.sun.net包下(rt.jar)。實現程式碼如下: 主程式類 package bg.httpserver; import com.sun.net.httpserver.HttpServer; import java.io.IO
java實現簡單的四則運算
四則運算 計算器本文出自 “十裏稻花香” 博客,請務必保留此出處http://5880861.blog.51cto.com/5870861/1943836java實現簡單的四則運算
java實現簡單二維迷宮(2)
blog 成員 new 構建 push port ava amp use 這次是改良版本。 將地圖封裝,老鼠封裝。是對Java基礎的一個練習吧。 這次實現也遇到了一些問題。主要是棧。封裝的mouse類中有成員變量i,j代表了老鼠的坐標。將mouse類對象m入棧的時候,總是入
Java實現簡單文件過濾器
想要 空格 遞歸 port 文件過濾 list rgs lis http 輸入路徑查找該路徑下的指定文件類型的文件 代碼思路: 想要循環遍歷文件夾下所有子文件夾,就要用到遞歸。 首先判斷路徑是否存在: 是:獲取文件 判斷是否文件夾: 是:調用自身
java實現簡單的單點登錄 (轉)
hresult 調查公司 exe ftp 說我 負數 是我 create 統一 摘要:單點登錄(SSO)的技術被越來越廣泛地運用到各個領域的軟件系統當中。本文從業務的角度分析了單點登錄的需求和應用領域;從技術本身的角度分析了單點登錄技術的內部機制和實現手段,並且給出Web-
java 實現簡單的短信發送
下載 har ase 設置 request enc value pri ring 現在中國網建上註冊一個自己的賬戶, 然後裏面有代碼案例,也有相應的下載jar包的地址 代碼如下: public class Message { public static void main
消息隊列 (2) java實現簡單的RabbtMQ
java實現 java cal png bit close 項目 rri XML 假設有如下問題: 1.如果消費者連接中斷,這期間我們應該怎麽辦? 2.如何做到負載均衡? 3.如何有效的將數據發送到相關的接收者?就是怎麽樣過濾 4.如何保證消費者收到完整正確
java實現連線vsftpd伺服器,上傳,下載,刪除。
核心程式碼如下: package com.bh.service; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcep
JAVA實現簡單控制檯五子棋遊戲
GobangMain這個類是遊戲的主方法,主要用於控制遊戲的執行,值得注意的是輸入的座標的格式是3,4的樣式,不能是其他的格式,也不能出現空格。 package com.qf.Gobang; import java.util.Scanner; import org.omg.COR
java實現簡單的MVC框架
.title { background: blue; height: 50px; line-height: 50px; border: 1px solid; color: red } 一、mvc的模式如下圖所示 二、基於路徑訪問的控制器 控制器BaseServlet類如下 package c
java實現讀寫伺服器檔案
https://github.com/MAXIAODONGS/Remote-operation-of-static-resources 這個主要實現java遠端訪問伺服器的讀寫檔案操作,自動登入讀寫檔案,以上程式碼整理來自網際網路,然後自己將很多瑣碎的東西整理在了一起 pom.xml要配置
Java實現簡單的資料結構(五)
(5)二叉樹 public class BinaryTreeNode { private Comparable data; private BinaryTreeNode root; private BinaryTreeNode left; private BinaryTreeN
Java實現簡單的資料結構(四)
(4)Queue import org.junit.Test; public class Queue { private int size = 0; private LinkedList linkedList = new LinkedList(); /** * 入隊方法
Java實現簡單的資料結構(三)
(3)Stack package com.coding.basic; import org.junit.Test; public class Stack { private ArrayList elementData = new ArrayList(); /** * 壓棧