??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美18免费视频,污视频在线免费观看网站,亚洲精品免费观看http://www.aygfsteel.com/jesson2005/articles/128450.html张金?/dc:creator>张金?/author>Thu, 05 Jul 2007 14:28:00 GMThttp://www.aygfsteel.com/jesson2005/articles/128450.htmlhttp://www.aygfsteel.com/jesson2005/comments/128450.htmlhttp://www.aygfsteel.com/jesson2005/articles/128450.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/128450.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/128450.html
很多人看C些長的FTP教程會沒什D心看下?珑֜q明得介紹一?一看就明的方式希望能好?還有一些發帖的FTP格式,W四?新手必須看看?

1.FTP概述
文g傌是指文件從一台計機上發送到另一台計機上,傌的文件可以包括電子報表、聲韟뀁編譯後的程序以及字處理E序的文檔文件?br>
2.FTP中的兩種工作方式
A.Standard模式 FTP的客戶端發?PORT 命o到FTPserver (PORT模式)
B.Passive模式FTP的客戶端發?PASV命o?FTP Server (PASV模式)

3. 怎樣把PASV模式改為PORT模式Q?br>CuteFtp
請點?--R輯----全局a置----連接型----選擇PORT或PASV---然後定?br>flashfxp
達R---參數a置----防火?代理/標識----把用被動模式前的小勑֏消即?br>leapftp
站點理器-----你要連接的站點-----高級Q?-Lpasv前面的勾

4.ftp://A:B@C:D 形式的說?br>A代表用戶?br>B代表密碼
C代表 FTP 地址或?IP 地址
D代表端口---------省略表示默認端口 21

5.Z麼FTP連接進去是空的,看不到文Ӟ
原因1Q不支持PASVQ請?PORT模式?br>原因2Q網站不支持list命oQ找到具體的鏈接Q用flashget下載

6.FTP 常見錯誤及解決方?br>
421錯誤Q同時連接該ftp的h敔R多,出FTPa置的h怺Q請{h的時候再連接?br>
530「not login"Q?br>用戶名或密碼錯誤Q獲得正的密碼重新連接?br>
「連接時Q無法連接」錯誤:該ftp暫時關機Q可能是服務器重新啟動,或者FTP進行E護Q等FTP正常再連接?br>
「無法解析域名」:
原因1Q該ftp的域名入錯誤,如漏打一個字母,使用了全角標點等?br>解決ҎQ去g該ftp論壇扑ֈ正確的域名入?br>原因2Q本地的域名解析服務器壞了(是指你的E絡服務商的域名解析服務Q?br>解決ҎQ等本地E絡修好卛_使用Q也可以直接輸入ftp的ip地址?br>原因3Q該ftp修改了域名?br>解決ҎQ去g該ftp論壇找正的域名?br>
「only one …… ip address……?br>原因1Q用多R程下載Q超過該ftp允許的線E?br>解決ҎQ看看自己是不是已經與該ftp有了連接Q如果有了就不要再開新的連接?br>原因2Q局域網內有其他人連接了該ftpQ長城寬帶等fttbҎ出現Q?br>解決ҎQ等qր小時,別h斷開後,再連接該ftp?br>
「連接拒絕」:恭喜你,你的ip已經被該ftp了?br>解決ҎQ等一D|間(pftpa定Q半時C天不{)Q才能連接該ftp?br>如果你的ip地址是動態的話,也可以斷開網i,重播上網連接FTP試試?br>
425 Q不能打開數據連接Q你可以嘗試用PORT模式來代替PASV模式Q或者反之?br>
550 No such file or directoryQ文件可能已E改名或者刪除了

Not connet,access deny拒絕連接a問錯誤Q不能匿名登錄和a問Q你必須提供用戶名和密碼才能登錄?br>
426Q關閉連接Q中止傳?。FTP 可能正在重新啟動Q或者服務器E護而關閉?br>
FTP口oQ?br>文g傌軟g的用格式為QFTP Q如果連接成功Q系i將提示用戶輸入用戶名以及口令:
LOGINQ(輸入合法的用戶名或者「ANONYMOUS」)
PASSWORDQ(輸入合法的口令,若以「ANONYMOUS」方式登錄,一般不用口令)

進入惌連接的FTP站點後,用戶可以進行相應的文件傳輸操作了Q其中一些重要的命o及相似的命o如下Q?br>Q?QHELP、?、RHELP、REMOTEHELP
HELP 示LOCAL端的命o說明Q若不接受則示所有可用命令;
Q?相當於HELPQ例如:Q?CDQ?br>RHELP 同HELPQ只是它用來示REMOTE端的命o說明Q?br>REMOTEHELP 相當於RHELP?br>
Q?QASCQASCIIQ、BINQBINARYQ、IMAGE、TYPE
ASCII 切換傌模式為文字模式(只能用來傳送DOC文gQ因為是7-BITQ?br>BINARY 切換傌模式Z進制模式Q除文字文g外皆用此模式Q;
IMAGE 相當於BINARYQ?br>TYPE 讓你更改或顯C目前傳輸模式?br>
Q?QBYE、QUIT
BYE 退出FTPQ?br>QUIT 相當於BYE?br>
Q?QCD、CDUP、LCD、PWD、!
CD 改變當前工作目錄Q例如:CD \PUB;
CDUP 回到上一層目錄,相當g打CD..Q?br>LCD 讓你更改或顯CLOCAL端的工作目錄Q例如:LCD \TMP;
PWD 示目前的工作目錄(REMOTE端)Q?br>Q?讓你埯外殼命oQ例如: QLS?br>
Q?QDELETE、MDELETE、RENAME
DELETE 刪除REMOTE端的文g
MDELETE 扚w刪除文gQ需配合Q或*Q?br>RENAME 更改REMOTE端的文g名?br>
Q?QGET、MGET、PUT、MPUT、RECV、SEND
GET 下傳文gQ?br>MGET 扚w下傳文gQ需配合萬用字元Q例如:MGET *.GZ;
PUT 上傳文gQ?br>MPUT 扚w上傳文gQ需配合萬用字元Q?br>RECV 相當於GETQRECV為RECEIVE的簡寫)Q?br>SEND 相當於PUT?br>
Q?QHASH、PROMPT、VERBOSE、STATUS、BELL
HASH 切換#字號的出現,每一?字號表示傳送了1024/8192 BYTESQ?br>PROMPT 切換INTERACTIVE ON/OFFQ?br>VERBOSE 切換所有文件傳輔RE的示Q?br>STATUS 示目前的一些參數;
BELL 當指令做完時會發Z聲叫职Ӏ?br>
Q?QLS、DIR、MLS、MDIR、MKDIR、RMDIR
LS 有點像UNIX下的LSQLISTQ命令;
DIR 相當於LS -LQLIST-LONGQ;
MLS 只是遠端某目錄下的文g存於LOCAL端的某文件裡Q?br>MDIR 相當於MLSQ?br>MKDIR 象DOS下的MDQ創建子目錄Q一樣;
RMDIR 象DOS下的RDQ刪除子目錄Q一樣;

Q?QOPEN、CLOSE、DISCONNECT、USER
OPEN 連接某個遠端FTP服務器;
CLOSE 關閉目前的連接Q?br>DISCONNECT 相當於CLOSEQ?br>USER 再入一ơ用戶名和口令(有點像UNIX下的SUQ?br>
PASV和PORT模式有什g同,Z麼PORT方式比PASV方式安全Q?br>FTP傌過程中要求徏立一個專門的連接來傳輸數據,建立連接有兩個方法:
一個就是FTP Server打開一個端口,Client可以去連接這個端口來建立連接。這就是PASV方式?br>一個就是FTP Client打開一個端口,Server去連接這個端口來建立連接。這就是PORT方式?br>然Q如果服務器打開了一個端口,意呌向互聯網打開了一個端口。所以PORT方式比PASV方式安全

]]>
JavaBean实现多个文g上传的两U方?/title><link>http://www.aygfsteel.com/jesson2005/articles/128448.html</link><dc:creator>张金?/dc:creator><author>张金?/author><pubDate>Thu, 05 Jul 2007 14:19:00 GMT</pubDate><guid>http://www.aygfsteel.com/jesson2005/articles/128448.html</guid><wfw:comment>http://www.aygfsteel.com/jesson2005/comments/128448.html</wfw:comment><comments>http://www.aygfsteel.com/jesson2005/articles/128448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jesson2005/comments/commentRss/128448.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jesson2005/services/trackbacks/128448.html</trackback:ping><description><![CDATA[<h1><strong>JavaBean实现多个文g上传的两U方?/strong></h1> <br>创徏Q?005-10-28 00:08:45<br>作者:Unlinux<br>来自: http://www.Unlinux.com<br><br><font class=f14 id=zoom><font color=#000000><br>摘要Q本文介l了JavaBean实现多个文g上传的两U方法,分别是用http协议和ftp协议实现。首先讲qChttp协议传送多个文件的基本格式和实C传的详细q程Q之后简单介l了使用ftpclient cdCftp方式的上传,最后对q两U方法进行了比较?br>关键字:JavaBean 、http 、ftp 、ftpclient<br>JavaBean是一U基于Java的Y件组件。JSP对于在Web?应用中集成JavaBeanlg提供了完善的支持。这U支持不仅能~短开发时_可以直接利用l测试和可信ȝ已有lgQ避免了重复开发)Q也为JSP应用带来了更多的可׾~性?br>文g的上传功能在ZB/S的开发模式中非常普遍。同其他开发工L比较QJSPҎ件的上传支持q不是很完美Q它既不象ASP那样一定需要用组件来完成Q也不像PHP那样直接提供了文件上载的支持。JSP实现文g上传的实现方式是q样的:使用ServletRequestcȝgetInputStream()Ҏ获得一个客L向服务器发出的数据流Q然后处理这个数据流Q从中分析、得到文件上传中传递到服务器的各个参数和数据,然后其中的文g数据存储Z个文件或插入到数据库中。通常JSP面中不处理文g的上传功能,而是把这些功能放到Servlet 或JavaBean中去实现。用Servlet完成文g上传的例子在一些JSP的相关书c中都有所介绍Q我q里介绍使用JeanBean是如何完成文件上传的。JSP中实现文件的上传可以采用两种方式即采用HTTP协议和FTP协议实现Q二者在传输的原理上存在很大的差异。以下将l合源代码对它们的实现做单介l,怿读者会从中有所收获。以下程序已l调试通过。调试的环境Qwindow 2000 server+Apache +tomcat4.0QJavaBean调试环境QJDK1.4+Editplus?br>在JSP中用JavaBean实现ZWeb的文件上传功能一般需要三U文件结合完成。这三种文g分别是提供界面的HTML面文g、完成调用实C传功能的JavaBean的JSP文g和实现JavaBean的Java的类文g。以下我重点讲q采用HTTP协议和FTP协议实现文g上传功能的JavaBean部分?br>1 采用HTTP协议实现多个文g的上?br>在过ȝHtml中,表单不能实现文g的上传,q多限制了一些网늚功能。RFC1867规范Q即Html中实现基于表单的文g上传Q对表单作出了扩展,增加了一个表单元素〈input typeQfileQ。通过使用q个元素Q浏览器会自动生成一个输入框和一个按钮,输入框可供用户填写本地的文g名和路径名,按钮可以让浏览器打开一个文仉择框供用户选择文g。具体的表单实现如下Q?br><FORMMETHOD="POST" ACTION="*.jsp" ENCTYPE="multipart/form-data"><br><INPUT TYPE="FILE" NAME="FILE1" SIZE="50"><br><INPUT TYPE="SUBMIT" VALUE="Upload"><br></FORM><br>当选择了粘贴文件后q接输入本地文件的l对路径Q表单的action属性值是*.jspQ这意味着hQ包括上载的文gQ将发送给*..jsp文g。在q个q程中实际上实CHTTP方式的文件上载。文件从客户端到服务器的上蝲是由HTTP协议的通用|关界面(CGI)支持的。这U上载方式要求浏览器和WEBServer两方面都能够支持Rfc1867。JavaBean 通过ServletRequestcȝgetInputStream()Ҏ获得一个客L向服务器发出的数据流、分析上传的文g格式Q根据分析结果将多个文g依次输出服务器端的目标文件中。本例中的JavaBeande的功能是由testUploadcd体实现。TestUploadcȝ框架如下Q?br>public class testUpload<br>{<br>public testUpload(){……}<br>public final void initialize(ServletConfig config) throws ServletException<br>{ m_application = config.getServletContext(); }<br>public void upload() throws testUploadException, IOException, ServletException<br>{………}<br>private void getDataSection(){………}<br>private void getDataHeader(){………}<br>public int save (String destPathName)<br>throws SmartUploadException, IOException, ServletException<br>{………}<br>……<br>}<br>通过initializeQ)Ҏ初始化Servlet的运行环境。用upload()Ҏ获得输入,q分析上传文件的格式Qƈ各个上传文件的属性赋l多个Filecd例处理,q些Filecd例由Filescȝ理。FilecL据各文g的属性调用它的save ()Ҏ多个文件依ơ输出服务器端的目标文g中。其中upload()Ҏ是关键,用于分析http1.1协议传送文件的格式。经q测试,我们得出传输文件的格式Q这对理解upload()Ҏ很有用。例如,上传我的文档 t.txt文g。格式如下:<br>//文g分隔W?br>-----------------------------7d226137250336 <br>//文g信息?br>Content-Disposition: form-data; name="FILE1"; filename="C:Documents and SettingsAdministrator.TIMBER-4O6B0ZZ0My Documents t.sql"<br>Content-Type: text/plain<br>//源文件内?<br>create table info(<br>content image null);<br>//下一个文件的分隔W?br>-----------------------------7d226137250336<br>Content-Disposition: form-data; name="FILE2"; filename=""<br>Content-Type: application/octet-stream<br>-----------------------------7d226137250336<br>从以上文件我们可以看出,HTTP协议在上传多个文件时Q是文件全部放到输入流q以一定的分隔W来区分的。实际上upload()Ҏ是要分析上面的文gQ确定分隔符的内宏V各个文件的内容格式、文件的完整路径名称、及其文件的实际数据的始末位|。这里需要说明的一Ҏ分隔W是随机的,它是传输文件的W一个回车符之前的所有字W?br>Upload()Ҏ的实现流E是Q首先将输入文件输出到字节数组m_binArray中,通过下面的代码实现?br>m_totalBytes=1024QtotalRead=0Q?br>for(; totalRead < m_totalBytes; totalRead += readBytes)<br>try<br>{ m_request.getInputStream();<br>readBytes = m_request.getInputStream().read(m_binArray, totalRead, m_totalBytes - totalRead);<br>}catch(Exception e){ throw new SmartUploadException("Unable to upload.");}<br>q里采用了@环中多字节读取方法,以上循环不断地读取数据直到数l填满ؓ止。如果一个文件可以完全得刎ͼ则文件的所有字节也可以全部得到。但是因为网l速度通常比CPU慢得多,所以程序很Ҏ在所有的数据到来之前清I网l缓冲区。实际上Q多字节dҎ在试图从暂时为空但是开攄|络~存取数据时Q该Ҏ会返?Q这表示没有数据存在但网l流没有关闭。这U情况下Q单字节Ҏ阻止运行程序的执行Q所以多字节的行Z于单字节read()Ҏ的行为。接下来分析字节数lm_binArray。首先找到分隔符Q用getDataHeader()Ҏq回文g信息头的|从中定源文件的完整路径名、源文g的扩展名和源文g文g内容格式Q用getDataSection()Ҏq回文g的内Ҏ据,q记录文件数据在字节数组中的h位置。然后生成一个Filecd例,q将文g的完整\径名、源文g的扩展名、源文g文g内容格式和文件的内容数据的v止位|放到Filecd例的属性中。找C一个分隔符Ql重复上q过E,直至分析完毕?br>2 采用FTP协议实现多个文g的上?br>FTP协议是Internet上用来传送文件的协议Q规定了Internet上文件互怼送的标准。在java中实现这一功能是借助FtpClientcd成的。具体实现过E:首先与FTP服务器徏立连接;初始化文件的传输方式Q包括ASCII和BINARY两种方式Q将文g输出到文件输入流FileInputStream中;FileInputStream中的数据d字节数组中;字节数组中的数据写入输出TelnetOutputStreamQ利用writeҎ数据写入到一个网l链接上Q。这样和源文件同名的一个文件就复制C服务器端。本例的JavaBean中通过connectServer()、upload()和closeConnect()三个Ҏ完成文g上传q程。主要实现如下:<br>public class ftpUpload<br>{ String filename;String filename1;FtpClient ftpClient;<br>public void connectServer(string server,string user,string password,string path)<br>{<br>//serverQFTP服务器的IP地址Quser:dFTP服务器的用户?br>//passwordQ登录FTP服务器的用户名的口oQpathQFTP服务器上的\?br>try{ ftpClient=new FtpClient();<br>ftpClient.openServer(server);<br>ftpClient.login(user, password);<br>System.out.println("login success!");<br>if (path.length()!=0) ftpClient.cd(path);<br>ftpClient.binary(); }catch (IOException ex) {System.out.println(ex);}<br>}<br>public void closeConnect()<br>{try{ ftpClient.closeServer();<br>}catch (IOException ex) {System.out.println(ex);}<br>}<br>public void upload() <br>{ filename1=findFileName(filename);<br>//从filename中分析出文g的名Uͼ作ؓ目标文g的名U?具体Ҏ实现未给?br>try {<br>TelnetOutputStream os=ftpClient.put(filename1);<br>java.io.File file_in=new java.io.File(filename);<br>FileInputStream is=new FileInputStream(file_in);<br>byte[] bytes=new byte[1024];<br>int c;<br>while ((c=is.read(bytes))!=-1){ os.write(bytes,0,c); }<br>is.close(); os.close();<br>} catch (IOException ex) {System.out.println(ex);}<br>}<br>}<br>connectServer()完成与FTP服务器徏立连接的功能Q用FtpClient的openServer(string server)Ҏ打开q程FTP服务?然后使用FtpClient的login(user, password)Ҏd服务器。登录远EFTP服务器有两种方式Q一U是注册用户dQ另一U是以匿名方式登录。前者要求用户首先注册ؓ服务器的客户Q服务器会给客户一个登录̎号和密码Q依据̎号和密码q结到服务器上。后者要求用户不用注册而用特D的用户?annoymous"?guest"有限制的讉Kq程L的公开文gQ现在许多系l要求用户将Email地址作ؓ口o。出于安全的目的Q大部分匿名FTPL一般只允许q程用户下蝲文gQ而不允许上传Q这依赖于FTP服务器的讄。用户可Ҏ实际情况选择使用两种方式。登录完成后使用FtpClient的binary()Ҏ初始化传输方式ؓ字节方式。upload()完成文g的上传功能。创建源文g的文件输入流FileInputStream,输入流写入到字节数l中Q利用TelnetOutputStream的writeҎ字节数l中的数据写入到一个网l链接上。由于TelnetOutputStream打开的是FTP服务器上的一个文Ӟ所以数据写入到了目标文件中Q这样就完成了文件上传。closeConnect()要求与服务器断开q接?br>以上只是单个文g上传的过E,如果是多个文件可以多ơ调用此上传q程。由以上两种方式我们可以看出采用FTP协议实现多个文g的上传比较简单,Ҏ实现。利用FTP协议上传文g一般是~写的客L的程序,服务器端的安全设|会比较复杂Q而利用HTTP协议上传文g则是服务器端的应用程序,相对来说安全讄会比较简单。ƈ且通过试发现FTP上传方式在传输大文g旉度是HTTP上传方式的几十倍甚臛_癑ր,但在传输于1M的文件时却比HTTP上传方式E慢一些。所以说两种传输方式各有优势Q请读者根据自w情况量力而行。如果有什么问题或者是需要其他部分的源码Q请与我联系Q?br><br>参考文献:<br>廖若雪,《Jsp高~程》,机械工业出版C,2001.3<br>黄理、洪亮等Q《Jsp高~程》,北京希望电子出版C,2001.10<br>Elliotte Rusty Harold著,刘东华、王巍、唐刚译QJava|络~程,中国电力出版C,2001.8<br>Bruce Eckel著,京京工作室译QJava~程思想,机械工业出版C,1999.4<br>http://www.jspsmart.com</font></font> <img src ="http://www.aygfsteel.com/jesson2005/aggbug/128448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jesson2005/" target="_blank">张金?/a> 2007-07-05 22:19 <a href="http://www.aygfsteel.com/jesson2005/articles/128448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的网l编E:用Java实现FTP服务? http://www.aygfsteel.com/jesson2005/articles/128447.html张金?/dc:creator>张金?/author>Thu, 05 Jul 2007 14:18:00 GMThttp://www.aygfsteel.com/jesson2005/articles/128447.htmlhttp://www.aygfsteel.com/jesson2005/comments/128447.htmlhttp://www.aygfsteel.com/jesson2005/articles/128447.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/128447.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/128447.html Java的网l编E:用Java实现FTP服务?/font> 关键字:不详
FTP(File Transfer Protocol 文g传输协议)是Internet 上用来传送文件的协议。在Internet上通过FTP 服务器可以进行文件的上传(Upload)或下?Download)。FTP是实时联机服务,在用它之前必须是具有该服务的一个用?用户名和口o)Q工作时客户端必ddC为服务器一方的计算ZQ用L录后可以q行文g搜烦和文件传送等有关操作Q如改变当前工作目录、列文g目录、设|传输参数及传送文件等。用FTP可以传送所有类型的文gQ如文本文g、二q制可执行文件、图象文件、声x件和数据压羃文g{?

 


FTP 命o


FTP 的主要操作都是基于各U命令基之上的。常用的命o有:

?讄传输模式Q它包括ASC?文本) 和BINARY 二进制模?

?目录操作Q改变或昄q程计算机的当前目录(cd、dir/ls 命o);

?q接操作Qopen命o用于建立同远E计机的连接;close命o用于关闭q接;

?发送操作,put命o用于传送文件到q程计算机;mput 命o用于传送多个文件到q程计算?

?获取操作Qget命o用于接收一个文Ӟmget命o用于接收多个文g?


~程思\


ҎFTP 的工作原理,在主函数中徏立一个服务器套接字端口,{待客户端请求,一旦客Lh被接受,服务器程序就建立一个服务器分线E,处理客户端的命o。如果客L需要和服务器端q行文g的传输,则徏立一个新的套接字q接来完成文件的操作?


~程技巧说?


1.d数设?

在主函数中,完成服务器端口的侦听和服务线E的创徏。我们利用一个静态字W串变量initDir 来保存服务器U程q行时所在的工作目录。服务器的初始工作目录是q序运行时用户输入的,~省为C盘的根目录?

具体的代码如下:

public class ftpServer extends Thread{
private Socket socketClient;
private int counter;
private static String initDir;
public static void main(String[] args){
if(args.length != 0) {
initDir = args[0];
}else{ initDir = "c:";}
int i = 1;
try{
System.out.println("ftp server started!");
//监听21L?
ServerSocket s = new ServerSocket(21);
for(;;){
//接受客户端请?
Socket incoming = s.accept();
//创徏服务U程
new ftpServer(incoming,i).start();
i++;
}
}catch(Exception e){}
}


2. U程cȝ设计

U程cȝ主要设计都是在run()Ҏ中实现。用run()Ҏ得到客户端的套接字信息,Ҏ套接字得到输入流和输出流Q向客户端发送欢q信息?

3. FTP 命o的处?

(1) 讉K控制命o

?user name(user) ?password (pass) 命o处理代码如下Q?

if(str.startsWith("USER")){
user = str.substring(4);
user = user.trim();
out.println("331 Password");}
if(str.startsWith("PASS"))
out.println("230 User "+user+" logged in.");


User 命o?Password 命o分别用来提交客户端用戯入的用户名和口o?

?CWD (CHANGE WORKING DIRECTORY) 命o处理代码如下Q?

if(str.startsWith("CWD")){
String str1 = str.substring(3);
dir = dir+"/"+str1.trim();
out.println("250 CWD command succesful");
}


该命令改变工作目录到用户指定的目录?

?CDUP (CHANGE TO PARENT DIRECTORY) 命o处理代码如下Q?

if(str.startsWith("CDUP")){
int n = dir.lastIndexOf("/");
dir = dir.substring(0,n);
out.println("250 CWD command succesful");
}


该命令改变当前目录ؓ上一层目录?

?QUIT命o处理代码如下Q?

if(str.startsWith("QUIT")) {
out.println("GOOD BYE");
done = true;
}


该命令退出及关闭与服务器的连接,输出GOOD BYE?

(2) 传输参数命o

?Port命o处理代码如下Q?

if(str.startsWith("PORT")) {
out.println("200 PORT command successful");
int i = str.length() - 1;
int j = str.lastIndexOf(",");
int k = str.lastIndexOf(",",j-1);
String str1,str2;
str1="";
str2="";
for(int l=k+1;l<j;l++){
str1 = str2 + str.charAt(l);
}
for(int l=j+1;l<=i;l++){
str2 = str2 + str.charAt(l);
}
tempPort = Integer.parseInt(str1) * 16 *16 +Integer.parseInt(str2);
}


使用该命令时Q客L必须发送客L用于接收数据?2位IP 地址?6?的TCP 端口受这些信息以8位ؓ一l,使用十进制传输,中间用逗号隔开?

?TYPE命o处理代码如下Q?

if(str.startsWith("TYPE")){
out.println("200 type set");
}


TYPE 命o用来完成cd讄?

(3) FTP 服务命o

?RETR (RETEIEVE) ?STORE (STORE)命o处理的代?

if(str.startsWith("RETR")){
out.println("150 Binary data connection");
str = str.substring(4);
str = str.trim();
RandomAccessFile outFile = new
RandomAccessFile(dir+"/"+str,"r");
Socket tempSocket = new Socket(host,tempPort);
OutputStream outSocket
= tempSocket.getOutputStream();
byte byteBuffer[]= new byte[1024];
int amount;
try{
while((amount = outFile.read(byteBuffer)) != -1){
outSocket.write(byteBuffer, 0, amount);
}
outSocket.close();
out.println("226 transfer complete");
outFile.close();
tempSocket.close();
}
catch(IOException e){}
}
if(str.startsWith("STOR")){
out.println("150 Binary data connection");
str = str.substring(4);
str = str.trim();
RandomAccessFile inFile = new
RandomAccessFile(dir+"/"+str,"rw");
Socket tempSocket = new Socket(host,tempPort);
InputStream inSocket
= tempSocket.getInputStream();
byte byteBuffer[] = new byte[1024];
int amount;
try{
while((amount =inSocket.read(byteBuffer) )!= -1){
inFile.write(byteBuffer, 0, amount);
}
inSocket.close();
out.println("226 transfer complete");
inFile.close();
tempSocket.close();
}
catch(IOException e){}
}


文g传输命o包括从服务器中获得文件RETR和向服务器中发送文件STORQ这两个命o的处理非常类伹{处理RETR命oӞ首先得到用户要获得的文g的名UͼҎ名称创徏一个文件输入流Q然后和客户端徏立时套接字q接Qƈ得到一个输出流。随后,文件输入流中的数据dq借助于套接字输出发送到客户端,传输完毕以后Q关闭流和时套接字?

STOR 命o的处理也是同Lq程Q只是方向正好相反?

?DELE (DELETE)命o处理代码如下Q?

if(str.startsWith("DELE")){
str = str.substring(4);
str = str.trim();
File file = new File(dir,str);
boolean del = file.delete();
out.println("250 delete command successful");
}


DELE 命o用于删除服务器上的指定文件?

?LIST命o处理代码如下Q?

if(str.startsWith("LIST")) {
try{
out.println("150 ASCII data");
Socket tempSocket = new Socket(host,tempPort);
PrintWriter out2= new PrintWriter(tempSocket.getOutputStream(),true);
File file = new File(dir);
String[] dirStructure = new String[10];
dirStructure= file.list();
String strType="";
for(int i=0;i<dirStructure.length;i++){
if( dirStructure[i].indexOf(".") == -1) {
strType = "d ";}
else
{strType = "- ";}
out2.println(strType+dirStructure[i]);
}
tempSocket.close();
out.println("226 transfer complete");
}
catch(IOException e){}


LIST 命o用于向客Lq回服务器中工作目录下的目录l构Q包括文件和目录的列表。处理这个命令时Q先创徏一个时的套接字向客户端发送目录信息。这个套接字的目的端口号~省?Q然后ؓ当前工作目录创徏File 对象Q利用该对象的list()Ҏ得到一个包含该目录下所有文件和子目录名U的字符串数l,然后Ҏ名称中是否含有文件名中特有的“.”来区别目录和文g。最后,得到的名称数组通过临时套接字发送到客户端?



]]>
վ֩ģ壺 | | | | ̶| ɽ| ˮ| | ״| ɽ| | | | | | Ͳ| | | | ǧ| | | ľ| ؼ| ȷ| | | | | | ӱʡ| | | ̳| | ɽ| ¡| | ̫| ˮ| |