import java.net.*public class ftpServer extends Thread{ public static void main(String args[]){
String initDir
initDir = "D:/Ftp"
ServerSocket server
Socket socket
String s
String user
String password
user = "root"
password = "123456"
try{
System.out.println("MYFTP服务器启动....")
System.out.println("正在等待连接....")
//监听21号端口
server = new ServerSocket(21)
socket = server.accept()
System.out.println("连接成功")
System.out.println("**********************************")
System.out.println("")
InputStream in =socket.getInputStream()
OutputStream out = socket.getOutputStream()
DataInputStream din = new DataInputStream(in)
DataOutputStream dout=new DataOutputStream(out)
System.out.println("请等待验证客户信息....")
while(true){
s = din.readUTF()
if(s.trim().equals("LOGIN "+user)){
s = "请输入密码:"
dout.writeUTF(s)
s = din.readUTF()
if(s.trim().equals(password)){
s = "连接成功。"
dout.writeUTF(s)
break
}
else{s ="密码错误,请重新输入用户名:"<br> dout.writeUTF(s)<br> <br> }
}
else{
s = "您输入的命令不正确或此用户不存在,请重新输入:"
dout.writeUTF(s)
}
}
System.out.println("验证客户信息完毕....")while(true){
System.out.println("")
System.out.println("")
s = din.readUTF()
if(s.trim().equals("DIR")){
String output = ""
File file = new File(initDir)
String[] dirStructure = new String[10]
dirStructure= file.list()
for(int i=0i<dirStructure.lengthi++){
output +=dirStructure[i]+"\n"
}
s=output
dout.writeUTF(s)
}
else if(s.startsWith("GET")){
s = s.substring(3)
s = s.trim()
File file = new File(initDir)
String[] dirStructure = new String[10]
dirStructure= file.list()
String e= s
int i=0
s ="不存在"
while(true){
if(e.equals(dirStructure[i])){
s="存在"
dout.writeUTF(s)
RandomAccessFile outFile = new RandomAccessFile(initDir+"/"+e,"r")
byte byteBuffer[]= new byte[1024]
int amount
while((amount = outFile.read(byteBuffer)) != -1){
dout.write(byteBuffer, 0, amount)break
}break
}
else if(i<dirStructure.length-1){
i++
}
else{
dout.writeUTF(s)
break
}
}
}
else if(s.startsWith("PUT")){
s = s.substring(3)
s = s.trim()
RandomAccessFile inFile = new RandomAccessFile(initDir+"/"+s,"rw")
byte byteBuffer[] = new byte[1024]
int amount
while((amount =din.read(byteBuffer) )!= -1){
inFile.write(byteBuffer, 0, amount)break
}
}
else if(s.trim().equals("BYE"))break
else{
s = "您输入的命令不正确或此用户不存在,请重新输入:"
dout.writeUTF(s)
}
}
din.close()
dout.close()
in.close()
out.close()
socket.close()
}
catch(Exception e){
System.out.println("MYFTP关闭!"+e)
}
}}
摘要本文解释了如何利用库用Java语言编写FTP客户端代码。它比较了FTP库的一个完全列表,演示了每个库的优点和缺点,并且帮助决策者为他们的需要选择适当的库。另外,本文阐述了Fa?ade模式如何在取代一个库时改变管理。最后,作者Jean-Pierre Norguet讨论并解决了由于缺乏权威性的说明书引起的一些问题。
让我们假设一个情景:我们要编写一个纯Java应用程序,该程序必须从运行FTP服务器的远程计算机上下载文件。我们也通过远程文件信息,像名字、日期、或者尺寸,来过滤下载。
自己来写一个FTP协议处理,尽管是有可能,并且可能很有趣。但是这样做也有可能有困难、花费长时间、并且有潜在的风险。既然我们不肯花费时间、精力、或者金钱自己来写一个处理器,那我们推荐使用一个可重用的现有的软件组件。万维网上有并且大量的库可供使用。有了一个FTP客户端库,下载一个文件用Java语言编写就像下面一样简单:
FTPClient ftpClient = new FTPClient()
ftpClient.connect("ftp.foo.com", "user01", "pass1234")
ftpClient.download("C:\\Temp\\", "README.txt")
// Eventually other operations here ...
ftpClient.disconnect()
寻找一个适合我们需要的高质量的Java FTP客户端库并不像他看起来那么简单;它可能相当困难。要找到一个Java FTP客户端库需要花一些时间。接着,在我们找到所有的已存在的库之后,我们选哪个?每个库适合不同的需要。库在质量上是不等的,并且它们的设计有本质的区别。每个提供一套不同的属性和使用不同类型的行话来描述他们。
因此,计算和比较FTP客户端库证明是困难而且令人迷惑的。重复使用已存在的组件是一个值得推荐的过程,但在这个例子中,启动它也是令人沮丧的。并且这有点羞愧:在选好的一个好的FTP库之后,剩下的工作就是例程了。
本文旨在使选择过程简短、容易、并且有价值。我首先列出了所有的FTP客户端库。接着,我定义和描述了库应该用某种方式找到的相关标准的一个表格。最后,我列出了一个总浏览的矩阵,该矩阵给出了库间相互比较的过程的快速浏览。所有的信息提供了我们作出一个迅速、可靠、和长期的决定所需的每件事。
使用JDK(Java 开发工具集)的FTP支持
用于FTP的访问规范是用于注释的请求:959(RFC959)。Sun Microsystems提供了JDK的一个RFC959执行。但是它是内部的、非文档化的、并且不提供任何资源。当RFC959在尚未公开时,它实际上是执行RFC1738、URL规范的一个公共界面的后终端。如图1。
图1. 使用JDK的FTP支持。
RFC1738的一个执行过程在JDK中作为标准给出。它为基本的FTP传送做一个可推理的工作。它是公共的、文档化的、并且提供源代码。要使用它,我们可编写下面语句:
URL url = new URL("ftp://user01:pass1234@ftp.foo.com/README.txttype=i")
URLConnection urlc = url.openConnection()
InputStream is = urlc.getInputStream()// To download
OutputStream os = urlc.getOutputStream()// To upload
使用JDK的FTP客户端严格的遵守标准推荐,但它有以下几个说明:
它从根本上区别于第三方的FTP客户端库;这些执行RFC959而不是RFC1738
RFC959用大多数的桌面FTP客户端工具执行。许多Java程序员使用这些工具连接到FTP服务器上。作为一个尝试,这些工具及有可能优先于类似的RFC959库。
URL 和URLConnection类只开放用于通讯的流。Sun库不为构造原始的FTP服务器响应成为像String、 File、 RemoteFile、 或者 Calendar之类的更合用的Java对象而提供直接支持。所以我们不得不编写更多的代码,只是为了把数据写入一个文件中或者开始一个目录列表。
正像RFC1738的3.2部分解释的一样,"最优化",FTP URL在每个 *** 作后要求关闭(控制)连接。这对于传送许多小文件是一种浪费、并且毫无效率。而且,作了特别限制FTP服务器可能把会这样一个通讯开销认为一个是恶毒的网络攻击或者滥用而拒绝提供进一步的服务。
最后,它缺乏几个有用的属性。
由于以上所有或者某种原因,可优先使用一个第三方的库。下面部分列出了可供选择的第三方的库。
见:http://www.javaworld.com/javaworld/jw-04-2003/ftp/jw-0404-ftptable.html
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)