安装mysql
sudo apt-get install mysql-server mysql-client
sudo apt-get install libmysqlclient-dev
以root身份进入mysql,这里root默认密码为空
sudo mysql -u root
//创建普通用户
mysql> CREATE USER 'abc'@'localhost' IDENTIFIED BY '123';
//创建数据库
mysql> create database FileServer;
//分配权限
mysql> GRANT ALL PRIVILEGES ON FileServer.* TO 'abc'@'localhost';
mysql> exit
//以普通用户登陆
mysql -uabc -p123
创建并初始化数据表
use FileServer;
create table UserInfo(
UserName varchar(128) primary key,
Salt char(32) not null,
PassWord char(128) not null
);
编写服务器端,服务器端启动,然后启动客户端,通过客户端可以输入以下命令进行服务器上的文件查看:
1.cd [目录名] #进入对应目录,cd .. 进入上级目录
2.ls #列出相应目录文件
3.puts [文件名] #将本地文件上传至服务器
4.gets [文件名] #下载服务器文件到本地
5.remove [文件、目录名] #删除服务器上文件或目录
6.pwd #显示目前所在路径
7.mkdir [目录名] #创建目录
8.clear #清空屏幕
9.其他命令不响应
客户端进行用户密码验证后,才可进行操作,客户端只能看到自己的文件,不能看到其他用户的文件。
服务端通过数据库存储用户名和密码。
文件传输过程中断,下次传输同一文件从中断处开始传输
服务端记录客户端连接时间及操作时间,写入log文件
针对连接上的客户端,超过30秒未发送任何请求,关闭其描述符
文件大小大于100M,将大文件映射进内存,进行网络传递
编译
cd server
mkdir home virtualFile //创建用户工作目录
mkdir build
cd build
cmake ..
make
修改 conf/server.conf 服务端ip和端口
192.168.67.128 //ip
2000 //端口号
/home/yu/AOS/FileServer/server/home //用户工作目录
启动服务端
./FtpServer ../conf/server.conf
编译
cd client
mkdir build
cd build
cmake ..
make
启动客户端
./FtpClient [服务端ip] [服务端端口]
先启动服务器,再启动客户端程序
服务端输出:
thread pool start success
client 192.168.67.128 36714 connect
...
客户端输出:
connect success
Please choose your action:
1.login
2.register
>> 2
Please input you UserName:user1
Input password:
register success
Please choose your action:
1.login
2.register
>> 1
Please input your UserName:user1
Input password:
login success
创建3个目录,列出目录,进入目录,查看目前所在路径
user1> mkdir dir1
user1> mkdir dir2
user1> mkdir dir3
user1> ls
type name size
d dir1 4096B
d dir2 4096B
d dir3 4096B
user1> cd dir1
user1> pwd
/dir1
user1> cd ..
user1> pwd
/
将本地文件上传
//清空屏幕
user1> clear
user1> puts The_Holy_Bible.txt
100.0%
puts success
user1> ls
type name size
d dir1 4096B
d dir2 4096B
d dir3 4096B
- The_Holy_Bible.txt 4351658B
将本地文件The_Holy_Bible.txt删除,测试下载功能
user1> gets The_Holy_Bible.txt
100.00%
gets success
测试remove功能,删除一个文件和一个目录
user1> remove The_Holy_Bible.txt
user1> remove dir1
user1> ls
type name size
d dir2 4096B
d dir3 4096B
等待30秒不输入命令,服务端自动断开客户端连接
日志记录查看log文件夹下的log文件
用户注册,客户端生成随机盐值(salt),对用户密码进行加密,客户端将用户账号,盐值,密文密码传输至服务端,服务端将用户信息存储到mysql中;用户登陆,客户端先将用户名传输给服务端,服务端根据用户名查找盐值,然后返回盐值给客户端,客户端用拿到的盐值对密码加密,然后传输密文密码至服务端,服务端将密文密码与mysql存储的密文密码进行比较,返回登陆成功与否
————————————————————————————
| 数据长度(n) | 数 据 |
| (4 B) | (n B) |
————————————————————————————
使用环形队列法,环上每个节点维护一个Set,监控线程设定每隔1秒触发的定时器,每次监控线程定时器超时,前进一个节点,将此节点的fd全部断开,然后清空Set;当客户端有请求到达时,从Set中删除此fd,然后将fd加进当前节点的前一个位置的Set中。