`
962685987962685987
  • 浏览: 4935 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用Java的Socket加IO流模拟FTP功能

阅读更多
最近学习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[i]);
        }
      }
      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();
  }
}
}
 

 

分享到:
评论

相关推荐

    Java源码包100个设计实例.zip

    Java二进制IO类与文件复制操作实例.rar Java从压缩包中提取文件.rar Java从网络取得文件.rar Java仓库管理系统,Access数据库.rar Java仿Vista界面风格的登录窗口.rar Java仿千千静听音乐播放器源代码.rar Java企业...

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    java源码包2

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包4

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...

    基于javatcpsocket通信的拆包和装包源码-python-interview-questions.io:python-intervie

    基于java tcp socket通信的拆包和装包源码Python 面试题 问:如何改进以下代码? import string i = 0 for letter in string . letters : print ( "The letter at index %i is %s" % ( i , letter )) i = i + 1 提及...

Global site tag (gtag.js) - Google Analytics