`
962685987962685987
  • 浏览: 5167 次
  • 性别: 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课程设计 ftp下载模拟

    Java课程设计中的FTP下载模拟是一项常见的实践任务,旨在帮助学习者深入理解网络协议、Java编程以及文件处理等核心概念。FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的标准协议,而通过Java实现...

    FTP 文件传输 基于JAVA的网络编程

    客户端需要模拟FTP命令的发送,如登录服务器、改变目录、列举目录内容、上传和下载文件。Java.io包提供了丰富的输入/输出流类,如`FileInputStream`和`FileOutputStream`,用于本地文件的读写,而`...

    java FTP客户端程序

    2. **Java FTP客户端库**:Java标准库中并没有直接提供FTP客户端,但可以通过`java.net.Socket`类模拟实现。不过,更常见的是使用Apache Commons Net库,它提供了`FTPClient`类,简化了FTP客户端的开发。 3. **...

    JAVA模拟FTP程序.doc

    在Java编程中,模拟FTP(File Transfer Protocol)程序是一项常见的任务,这涉及到通过网络进行文件传输的实现。本文档提供了一个简单的Java FTP客户端程序的代码示例,它使用了Swing库来构建用户界面,并利用Java的...

    ftp.rar_ftp_ftp java_java ftp

    在Java中,实现FTP客户端通常会用到`java.net.Socket`类来建立网络连接,`java.io`包中的输入/输出流处理数据传输,以及`org.apache.commons.net.ftp`库,这个库提供了FTPClient类,简化了FTP协议的许多复杂操作,如...

    ftp.rar_FTP CLIENT_ftp java_ftp客户端_ftp客户端 java_客户端

    1. **Java FTP库**:Java标准库中的`java.net.Socket`和`java.io`可以用于基本的TCP连接和文件I/O,但更高级的FTP操作通常会使用`org.apache.commons.net.ftp`库,这个库简化了FTP协议的处理,包括登录、目录浏览、...

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

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

    Java简单模拟QQ

    在本项目中,"Java简单模拟QQ"是一个尝试用Java编程语言实现的简易版即时通讯软件,它包含了QQ的基本功能,如用户注册、登录、聊天、远程协助以及文件传输。以下将详细介绍这些功能的实现原理及其相关的Java技术知识...

    http1.0 的ftp模拟java实现(含多线程)

    使用Java实现HTTP 1.0的FTP模拟,通常会用到`java.net.Socket`和`java.net.ServerSocket`类来处理客户端和服务器之间的连接,以及`java.io`包中的类来读写文件。 4. **多线程**: 在Java中,多线程可以通过继承`...

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

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

    Java语言实现简单FTP软件 FTP协议分析(1)

    Java的`java.net`包提供了Socket和ServerSocket类用于网络通信,`java.io`包提供了流处理类,而`java.util`中的ArrayList或HashMap等数据结构可以帮助管理FTP会话中的状态和数据。 总的来说,构建一个简单的Java ...

    java源码包3

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

    java源码包2

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

    ftp文件传输.zip

    1. **FTP连接**:使用`java.net.Socket`类建立与FTP服务器的TCP连接。之后,可以使用`org.apache.commons.net.ftp.FTP`或`org.apache.commons.net.ftp.FTPClient`库来管理FTP会话。 2. **登录验证**:通过调用`...

    java文件上传下载

    首先,**Java文件上传下载**涉及到I/O流处理,Java标准库提供了`java.io`和`java.nio`包来支持文件读写操作。文件上传是将本地文件传输到服务器的过程,这通常通过HTTP、FTP或其他协议完成。在Java中,可以使用`java...

    JavaFTP:基本的 Java FTP 服务器和客户端

    在Java中实现FTP,主要依赖于Java的`java.net`和`java.io`包,它们提供了网络连接和输入/输出流的基础支持。例如,`java.net.Socket`用于建立TCP连接,`java.io.InputStream`和`java.io.OutputStream`则用于读写数据...

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

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

    java源码包4

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

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

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

    SimpleFTP:Java中FTP服务器的简单实现

    在Java中实现FTP服务器,我们需要使用Java的Socket编程来处理网络连接,以及IO流来处理数据传输。以下是一些关键的步骤: 1. **创建监听Socket**:服务器启动时,需要创建一个Socket监听特定端口(如21,这是FTP的...

Global site tag (gtag.js) - Google Analytics