用java实现ftp的多线程下载

1:字节流结构:
每次发送12+1024个字节
其中,前七个字节字节表示命令
第七到第十二个字节表示后面1024字节中的有效字节的长度
例如一帧中前12个字节的内容为"UPFILEN00012"表示要上传文件名,文件名的长度是12。那么程序就在后面的1024个字节中去12个字节,在把它转换为字符串,作为要上传的文件名。

2:命令结构
Server端:
DISCONN:断开连接
LSFILES:发送当前目录文件列表
ENDFILE:上传一个文件的结束标记
UPFILEN:表示要上传一个新的文件,并且此包中包含了文件名
UPDATAS:表示本包是要上传的数据
DNFILEN:表示要下载的文件名,服务器要执行向客户端传输文件的操作
Client端:
DISCONN:断开连接
LSFILES:接收服务器当前目录文件列表
ENDFILE:下载一个文件的结束标记
DNDATAS:表示本包是要下载的数据

3:文件结构
FtpServer:ftp软件的服务器端,目前在端口2121监听,支持多线程,文件的上传,下载,列表。
FtpClient:ftp软件的客户端,默认连接本机的服务器端,在端口2121,支持文件的上传,下载,列表。
FtpClientUI:ftp软件的客户端的用户界面,完全采用Swing技术,手工编写,没有用JB自动生成。
PublicFunc:提供一些公共的静态方法例如将给定的String对象分装成要发送的帧。将数字格式化成长度为五位的String类型对象。
package cn.edu.bit.software.ftptrans;

import java.io.*;
import java.net.*;
import java.util.Vector;
import java.util.logging.*;

public class FtpServer
{
  //客户端socket对象
  private ServerSocket m_servSocket;

  //ftp服务器的端口号
  private int SERVER_PORT;

  //ftp服务器所允许的最大连接数
  private int MAX_CONN;

  //连入的客户端处理对象管理器
  private Vector vecClient;

  //设定一个log日志对象
  private Logger mylog;

  private ConsoleHandler handler;

  String strServHome;

  public FtpServer(int servPort, int maxConn)
  {
    SERVER_PORT = servPort;
    MAX_CONN = maxConn;
    strServHome = "c://";
    vecClient = new Vector();
    /*------------初始化log------------*/
    try
    {
      handler = new ConsoleHandler();
      handler.setLevel(Level.ALL);
      mylog = Logger.getLogger("FtpServer");
      mylog.addHandler(handler);
      mylog.setLevel(Level.ALL);
    }
    catch (SecurityException e)
    {
      mylog.warning("在设置程序日志级别时出现异常");
      mylog.warning(e.getMessage());
    }

    /*--------------初始化服务器,端口2121----------------------*/
    try
    {
      m_servSocket = new ServerSocket(SERVER_PORT, MAX_CONN);
      while (true)
      {
        mylog.finest("FtpServer开始在端口2121监听");
        Socket clientSocket = m_servSocket.accept();
        vecClient.add(clientSocket);
        mylog.info("#" + vecClient.size() + "号客户端连入");
        new TransHandler(this, clientSocket, vecClient.size()).start();
      }
    }
    catch (IOException e)
    {
      mylog.warning("在初始化FtpServ时出现错误");
      mylog.warning(e.getMessage());
    }
  }

  public void deleteClient(TransHandler handler)
  {
    try
    {
      vecClient.remove(handler);
      vecClient.setSize(vecClient.size() - 1);
      mylog.info("第#" + handler.iClientNum + "号客户端断开了与服务器的连接!");
    }
    catch (Exception e)
    {
      mylog.warning("在删除第#" + handler.iClien

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值