1. 程式人生 > >Java實現簡單的FTP伺服器

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,後續將會繼續開發完善給伺服器。

實現思想

  1. 建立容量固定的執行緒池對控制連線進行處理
  2. 使用ServerSocket進行監聽,每個控制連線的請求到來之後,提交給執行緒池進行處理。
  3. 對於命令使用工廠方法模式進行設計,當需要新增新的命令時,只需要新增一個命令類,修改工廠方法,其餘模組不需要改動,可擴充套件性較好,符合開閉原則

遇到的問題

  1. 實現STOR命令時,無法從Socket中獲取客戶端上傳的檔案,其原因是返回的狀態碼中遺漏了CR、LF對。
  2. 實現首先需要PORT命令傳輸socket埠的命令時,如DIR,不知道客戶端會預設地傳送PORT命令傳輸Socket埠,以為是在客戶端中自行傳輸Socket埠,後來通過Debug命令的執行過程發現客戶端在傳送DIR命令前,會先發送PORT命令。
  3. 如何避免網路攻擊,提高伺服器的安全性,如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(); /** * 壓棧