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