用java写过FTP的大师来帮我分析下

来源:百度知道 编辑:UC知道 时间:2024/06/04 03:49:52
用java Socket写过FTP服务器的高手帮我讲解下
我自己来了N多的源码来看,懵懵懂懂的,很多地方不明白.写过这东西的人才帮忙分析分析,或者有精简的代码让我研

究下(不要网上copy吖,我自己下了N多了,就是太杂)
我有很多问题要问,先问为什么服务器不会响应,你们帮我想想可能出现的原因.
我看了N多代码发现同样的步骤,所以我也跟着做了, 先建一个 ServerSocket,让它无限监听下去,这一步是没有问题,

因为当我输入ftp://localhost:端口号 是有输出我做的测试语句
第二步就出问题了: 第二步是当监听到一个客户端socket ,写一个无限循环的读取客户端输入,但是就是这边就堵塞

了,一直在等待客户端输入. 我看了其他代码,他们也是这么做的,我一开始也想不通为什么可以这样等待用户输入,后

来我是这样理解的,当输入ftp://localhost本来就是一个Socket客户端对象了,而登录和显示或退出那些命令会自动的

发送给服务器,虽然我是这样理解,但不知道对不对,如果对,为什么我的程序到了第二步的时候却卡住了,如果不对,那

为什么其他代码就是这样写的;
说了可能有些乱,我把代码贴上来,希望写过的大师帮我看看我是不是漏了什么,或者我的理解错误了.
因为无用的代码太多,我就把我说的主要两步代码给贴上来,其他还没继续下去,测试到第二步就卡在那了;
这是第一步:
ServerSocket serversocket=new ServerSocket(21);
for(;;){
socket=serversocket.accept();
System.out.println("IP"+socket.getLocalAddress().getAddress()+"发送链接请求");
new Thread(new FtpClip(socket)).start();
}
这是第二步:cla

不要用Buffered,因为buffered会缓存一定字节,而这个时候如果客户端只是发送了一条命令的话,那么buffered会堵塞在读取缓存,于是就呃掉了。。。

读取客户端命令的时候自己判断什么时候是一个命令的结束,每个命令读取结束后就执行该命令,然后再读取下一个命令,弄一个byte[]把命令零时存着。至于写回到客户端的话,用buffered应该没问题了,不过记得所有数据写到buffered之后要flush把数据刷到底层的socket里去。

哦,如果客户端上传文件的话,那读取到上传文件的标志后,自己弄一个大点的数组来读取数据,数据的结束也要自己判断。

补充:
while(status){
System.out.println("这边有执行到");
byte buff[]=new byte[1024*8];
for(int i=0,boolean isCmdEnd=false;!isCmdEnd;){
int tmp=in.read();
switch(tmp){
case '\r':break;
case '\n':String cmd=new String(buff,0,i);System.out.println("cmd="+cmd);handleCMD(cmd);isCmdEnd=true;break;
default :buff[i++]=tmp;
}
}
}

没测试过,不知道行不,你自己试一下。