package experiment1;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Scanner;
public class FTPClientTest {
public static void main(String[] args) {
System.out.println("========客户端========");
System.out.println("FTP Client启动");
FTPClient fc = new FTPClient();
fc.tidyCommand();
}
}
class FTPClient{
private String DownlDir;
private String PutDir;
private Socket socket;
public FTPClient() {
}
//主函数,用于调用连接方法、接受控制台输入命令并选择接下来要执 行的方法
public void tidyCommand(){
connect();
String command = null;
DataOutputStream dos = null;
DataInputStream dis = null;
BufferedReader br = null;
try {
br = new BufferedReader(
new InputStreamReader(System.in));
dos = new DataOutputStream(
new BufferedOutputStream(this.socket.getOutputStream()));
dis = new DataInputStream(
new BufferedInputStream(this.socket.getInputStream()));
while(true){
System.out.print("ftp:\\>");
command = br.readLine();
if(command.startsWith("put ")){
sendfiles(command.substring(4),dos);
}else if(command.startsWith("get ")){
receivefiles(command.substring(4),dis,dos);
}else if(command.equals("exit")){
disconnect(dos, dis);
break;
}else{
System.out.println("无效指令,请重试!!!");
}
}
dis.close();
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void connect(){
System.out.println("FTP Client连接中...");
try {
this.socket = new Socket("localhost",8888);
} catch (IOException e) {
System.out.println("FTP Client连接失败!!!");
e.printStackTrace();
}
System.out.println("FTP Client连接成功!!!");
setPutDir();
setDownlDir();
}
public void disconnect(DataOutputStream dos,DataInputStream dis){
if(this.socket != null){
try {
dos.writeUTF("disconnect");
dos.flush();
this.socket.close();
} catch (IOException e) {
System.out.println("网络连接异常,程序退出!!!");
e.printStackTrace();
}
}
System.out.println("程序退出!!!");
}
//请设置上传路径
public void setPutDir(){
System.out.println("请设置上传路径!!!(例如:D:\\lll)");
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
String PutDir = sc.next();
File file = new File(PutDir);
if(file.isDirectory()){
System.out.println("设置成功!!!");
}else {
System.out.println("设置失败!!!请重新输入");
setPutDir();
}
this.PutDir = PutDir;
}
//请设置下载路径
@SuppressWarnings("resource")
public void setDownlDir(){
System.out.println("请设置下载路径!!!(例如:D:\\lll)");
Scanner scanner = new Scanner(System.in);
String DownlDir = scanner.next();
File file = new File(DownlDir);
if(file.isDirectory()){
System.out.println("设置成功!!!");
}else {
System.out.println("设置失败!!!请重新输入");
setDownlDir();
}
this.DownlDir = DownlDir;
}
//接收文件方法,用于接收服务器端发来的文件
public void receivefiles(String filename,DataInputStream dis,DataOutputStream dos){
BufferedOutputStream bout = null;
File file = null;
try {
file = new File(this.DownlDir,filename);
dos.writeUTF("get " + filename);
dos.flush();
boolean exist = dis.readBoolean();
if(exist){
System.out.println("开始下载"+file.getName()+"文件....");
long size = dis.readLong();
bout = new BufferedOutputStream(new FileOutputStream(file));
for(int i=0;i<size;i++) {
bout.write(dis.read());
bout.flush();
}
bout.close();
}else {
System.out.println("文件不存在!!!下载文件失败");
return;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("文件"+file.getName()+"下载成功!!!");
}
//发送文件方法,用于上传文件给服务器端
public void sendfiles(String filename,DataOutputStream dos){
File file = null;
BufferedInputStream bis = null;
try {
file = new File(this.PutDir,filename);
if(file.exists()){
System.out.println("开始上传"+file.getName()+"文件....");
long size = file.length();
dos.writeUTF("put " + file.getName());
dos.flush();
dos.writeLong(size);
dos.flush();
bis = new BufferedInputStream(new FileInputStream(file));
for(int i=0;i<size;i++) {
dos.write(bis.read());
dos.flush();
}
bis.close();
}else{
System.out.println("上传文件失败!!!文件不存在");
return;
}
} catch (IOException e) {
System.out.println("文件"+file.getName()+"上传失败!!!");
e.printStackTrace();
return;
}
System.out.println("文件"+file.getName()+"上传成功!!!");
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Java高级程序设计实验代码-多线程版-FTP服务器设计与实现.zip

共2个文件
java:2个

1 下载量 74 浏览量
2023-09-27
03:07:38
上传
评论
收藏 3KB ZIP 举报
温馨提示
"Java高级程序设计实验代码-多线程版-FTP服务器设计与实现.zip" 是一份令人振奋的资源,它代表了Java高级程序设计的精髓和多线程技术的深度理解。这个ZIP文件包含了一个完整的FTP服务器的源代码,而且不同于传统的FTP服务器,它是一个多线程版的FTP服务器,具有更高的性能和更好的并发处理能力。以下是这份资源的主要特点和内容亮点: 全面的FTP服务器实现: ZIP文件中包含了一个完整的FTP服务器的源代码,涵盖了FTP协议的基础实现、多线程编程技巧、服务器性能优化、数据传输安全等各个方面。这意味着读者可以深入研究代码,了解每个功能的实现方式,学会如何构建一个高性能的FTP服务器。 多线程设计: 该FTP服务器采用多线程设计,以实现更好的性能和并发处理。通过研究这份源代码,读者将学会如何使用Java多线程机制来构建一个高效的FTP服务器,从而满足大规模数据传输的需求。这对于开发者来说是一个非常重要的技能,尤其是在处理大量用户并发访问时。 实际操作: 源代码中不仅有注释和文档,还包括了一个完整的多线程FTP服务器项目,读者可以通过实际操作来学习并深入理解FTP服务器的构建过
资源推荐
资源详情
资源评论




























收起资源包目录



共 2 条
- 1
资源评论

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

程序员Ale-阿乐
- 粉丝: 1w+
- 资源: 99
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- springbootAI医疗诊断系统类情感分析平台源码+论文+视频2_最新.zip
- 鸿蒙网络编程示例仓库,包括鸿蒙网络编程相关的主要网络协议及UI组件 本仓库所有示例均为完整代码,使用ArkTS语言或仓颉语言编写,包括详细的代码注释及完整的运行演示文档,都可以独立编译运行
- java虚拟机、java jvm 、面试八股文、面试,自学
- springbootAI医疗诊断系统类客户管理系统源码+论文+视频2_最新.zip
- springbootAI医疗诊断系统类企业管理平台源码+论文+视频2_最新.zip
- springboot企业协作平台类用户反馈平台源码+论文+视频2_最新.zip
- **5KW高效率MPPT太阳能控制器:基于STM32F103RCT6主控平台的全面保护与在线升级方案**,基于STM32F103RCT6的5KW高效MPPT太阳能控制器:支持485通讯与高压电池组供电
- 吴恩达新作《如何在人工智能领域建立你的职业生涯》
- springboot企业健康管理平台类电商产品推荐平台源码+论文+视频2_最新.zip
- springboot企业内部数据分析平台类环境监控平台源码+论文+视频2_最新.zip
- springboot企业健康管理平台类跨平台销售系统源码+论文+视频2_最新.zip
- springboot企业健康管理平台类交通信息平台源码+论文+视频2_最新.zip
- springboot仓储管理类金融智能平台源码+论文+视频2_最新.zip
- springboot企业云存储平台类客户管理系统源码+论文+视频2_最新.zip
- 基于蒙特卡洛方法的风电与光伏功率场景生成技术:考虑时间相关性的MATLAB实现,基于蒙特卡洛方法的风电光伏功率场景生成方法(含时间相关性考虑及概率计算),基于蒙特卡洛的风电功率 光伏功率场景生成方法
- 鸿蒙原生ArkTS与JavaScript通信框架
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
