设为首页 收藏本站
查看: 1218|回复: 0

[经验分享] 用Java的Socket加IO流模拟FTP功能

[复制链接]

尚未签到

发表于 2016-6-10 11:19:46 | 显示全部楼层 |阅读模式
最近学习java编程是一个实验让我困惑了很久就是:

编写实现类似FTP功能的程序,客户程序向服务器发送字符串”ls”,服务器返回几个文件名,客户程序从中选择一个文件,服务器将该文件发送给客户端,客户程序接受该文件并保存在本地硬盘中。(说明:不要求采用FTP协议实现)

下面把代码贴出来,可以实现文件传送,




传送文件中,服务器端吧文件对象内容写到byte数组中然后由socket发送



接收端主要也是读getinputstream然后保存到byte数组中,在写入到文件中



客户端程序:


  



package     conan;
import java.io.*;
import java.net.*;
class FTPClient extends Thread{
Socket     sl;   
DataOutputStream dos;
DataInputStream dis;
public static void main (String[] args) {
FTPClient ftpc=new FTPClient();
ftpc.start();   
}
public     String GetCom()throws Exception{
System.out.println("请输入命令: " );
InputStreamReader is=new InputStreamReader(System.in);
char [] buf=new char [100];   
int len = is.read(buf);
String str=new String(buf,0,len).trim();
return str;
}
public     String GetFileName()throws Exception{//获得输入的文件名
System.out.println("输入文件名: " );
InputStreamReader is=new InputStreamReader(System.in);
char [] buf=new char [100];
int len2=is.read(buf);
String str=new String(buf,0,len2).trim();   
return str;
}
public     void     receiveFile(Socket s) throws Exception    //接收文件
{                        
sl= s;
String filename=GetFileName();
dos=new DataOutputStream(sl.getOutputStream());
dos.writeUTF(filename);
System.out.println("发送文件名成功" );
File f=new File(File.separator);//当前根目录
File file =new File(f,"Downloads" +File.separator+filename); //保存到当前目录得Downloads文件里面                    
sl=new Socket("127.0.0.1" ,5432);    //创建一个socket对象用来传送文件            
BufferedOutputStream buff=new BufferedOutputStream(new FileOutputStream(file));
dis=new DataInputStream(sl.getInputStream());
byte []    line=new      byte [102400];   
int mount;
System.out.println("开始接收文件" );
System.out.println("文件传送中...." );
while ((mount=dis.read(line))!=-1){
buff.write(line,0,mount);
buff.flush();//刷新   
Thread.sleep(50);//设置一个等待时间,有利于接收文件
}
sl.close();
buff.close();
System.out.println("finished" );
}
public void run(){
try {
Socket sc;
sc=new Socket("localhost" ,4321);
dos=new DataOutputStream(sc.getOutputStream());
dos.writeUTF(GetCom());
dis=new DataInputStream(sc.getInputStream());
for (int i=0;i<30;i++){
System.out.println(dis.readUTF());   
}
receiveFile(sc);
}
catch (Exception e){
e.printStackTrace();
}   
}
}
 



服务器端程序:


package conan;
import     java.net.*;
import     java.io.*;
class FTPServer extends Thread
{   
ServerSocket server,server1;
Socket s;
DataInputStream dis;
DataOutputStream dos;
public static void main (String[] args) {
FTPServer ftps=new FTPServer();
ftps.start();
}
public     void sendFile(String filename)throws Exception
{
try {   
server1=new ServerSocket(5432);
s=server1.accept();
File path=new File(File.separator);//当前根目录
File file=new File(path,filename);//创建该文件对象
System.out.println("将文件独到缓冲流中" );
BufferedInputStream buffile=new BufferedInputStream(new FileInputStream(file));
byte [] buf=new byte [102400];//每次发送的块打大小
int mount;
dos=new DataOutputStream(s.getOutputStream());
System.out.println("开始传送文件" );
while ((mount=buffile.read(buf))!=-1){//传送文件,将文件内容以字节形式保存到buf中再发送
dos.write(buf,0,mount);
Thread.sleep(50);                                
}                        
System.out.println("文件传送完毕" );
server1.close();
s.close();//关闭清理工作
buffile.close();            
}
catch (Exception e){
e.printStackTrace();
}
}
public void run(){
try {
server=new ServerSocket(4321);//4321端口用来接接收命令
System.out.println("Listen at 4321 port" );
while (true )
{
s=server.accept();//监听
dis=new DataInputStream(s.getInputStream());
byte [] buf=new byte [100];
int len=dis.read(buf);
String str=new String(buf,0,len).trim();
System.out.println("接收命令成功" );
if (str.startsWith("ls" )){
File localfile=new File(File.separator);
String[] filelist=localfile.list();
dos=new DataOutputStream(s.getOutputStream());//输出文件列表
dos.writeUTF("-------------------File    List--------------------" );
for (int i=0;i<30;i++){
dos.writeUTF(filelist);
}
}
dis=new DataInputStream(s.getInputStream());
String filename_from_client=dis.readUTF().trim();
System.out.println("接收文件名成功" );
System.out.println("传送得文件名 :" +filename_from_client);
sendFile(filename_from_client);

}
}
catch (Exception ex){
ex.printStackTrace();
}
}
}
 




  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-228594-1-1.html 上篇帖子: java开发FTP客户端列出指定目录下面所有文件 下篇帖子: vsFTPd建立多个虚拟用户支持ftp不同访问
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表