import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* handler
*
* @author 庞博
*
*/
public class Handler implements Runnable { // 负责与单个客户通信的线程
ServerSocket serverSocket;
private Socket socket;
private final int PORT = 2021; //tcp端口
public static DatagramPacket dataPacket;
public static DatagramSocket dataSocket;
public static byte[] sendDataByte;
static final String HOST = "127.0.0.1"; //连接地址
public Handler(Socket socket) {
this.socket = socket;
}
public void run() { // 执行的内容
try {
String filePath = "D:\\test\\";
System.out.println(socket.getInetAddress() + ">连接成功 "
+ socket.getPort()); //客户端信息
//输入流,读取客户端信息
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
//输出流,向客户端写信息
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
PrintWriter pw = new PrintWriter(bw, true); //装饰输出流,true,每写一行就刷新输出缓冲区,不用flush
String info = null; //接收用户输入的信息
String[] strArray = null;
dataSocket = new DatagramSocket();
while((strArray = br.readLine().split("\\s")) != null) {
System.out.println(strArray[0]); //输出用户发送的消息
if(strArray[0].equals("ls")){
pw.println(getFiles(filePath)); //向客户端返回用户发送的消息,println输出完后会自动刷新缓冲区
}
if(strArray[0].equals("cd")){
if(strArray.length < 2){
pw.println("请指定一个文件夹!");
continue;
}
if(strArray[1].equals("..")){
if(filePath.equals("D:\\test\\")){
pw.println("已在根目录下!");
continue;
}
else{
System.out.println("退回上一级");
filePath = filePath.substring(0,filePath.lastIndexOf("\\"));
filePath = filePath.substring(0,filePath.lastIndexOf("\\")) + "\\";
pw.println(getFiles(filePath));
}
}
else {
int flag = 0;
File root = new File(filePath);
File[] files = root.listFiles();
for(int i = 0;i < files.length;i++){
if(strArray[1].equals(files[i].getName()) && files[i].isDirectory())
flag = 1;
}
if(flag == 1){
System.out.println("进入" + strArray[1]);
filePath = filePath + strArray[1] + "\\";
System.out.println(filePath);
pw.println(getFiles(filePath));
}
else{
System.out.println("不存在");
pw.println("不存在该文件夹!");
}
}
}
if(strArray[0].equals("get")){
if(strArray.length < 2){
pw.println("请指定文件!");
continue;
}
int flag = 0;
File root = new File(filePath);
File[] files = root.listFiles();
for(int i = 0;i < files.length;i++){
if(strArray[1].equals(files[i].getName()) && !files[i].isDirectory())
flag = 1;
}
String filename = strArray[1];
if(flag != 1){
System.out.println("不存在");
pw.println("不存在该文件!");
continue;
}
else {
pw.println("开始传输"+filename);
//获取端口号
int port = Integer.parseInt(strArray[2]);
String sendfilePath = filePath + filename;
DataInputStream fis = new DataInputStream(
new BufferedInputStream(new FileInputStream(sendfilePath)));
sendDataByte = new byte[1024];
int read = 0;
long a = new Date().getTime();
while (true) {
if (fis != null) {
read = fis.read(sendDataByte);
}
if (read == -1) {
sendDataByte = "end".getBytes();
DatagramPacket endpkg = new DatagramPacket(sendDataByte, sendDataByte.length,
(Inet4Address) Inet4Address.getByName("localhost"), port);
System.out.print("用时:");
System.out.println(new Date().getTime() - a);
dataSocket.send(endpkg);
break;
}
dataPacket = new DatagramPacket(sendDataByte, sendDataByte.length,
(Inet4Address) Inet4Address.getByName("localhost"), port);
dataSocket.send(dataPacket);
TimeUnit.MICROSECONDS.sleep(1);// 限制传输速度
}
}
}
if (strArray[0].equals("bye")) { //如果用户输入“bye”就退出
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
if (null != socket) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private static ArrayList<String> filelist = new ArrayList<String>();
static String getFiles(String filePath) {
String str = "";
File root = new File(filePath);
File[] files = root.listFiles();
for (File file : files) {
if (file.isDirectory()) {
/*
* 递归调用
*/
getFiles(file.getPath());
filelist.add(file.getPath());
str = str + "<dir> " + file.getName() + " " + file.length()+"@" ;
} else {
str = str + "<file> " + file.getName() + " " + file.length() + "@";
}
}
return str;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
2) 基于Java Socket TCP和UDP实现一个简易的网络文件服务程序,包含服务器端FileServer和客户端FileClient; 3) 服务器端启动时需传递root目录参数,并校验该目录是否有效; 4) 服务器启动后,开启TCP:2021端口,UDP:2020端口,其中,TCP连接负责与用户交互,UDP负责传送文件; 5) 客户端启动后,连接指定服务器的TCP 2021端口,成功后,服务器端回复信息:“客户端IP地址:客户端端口号>连接成功”; 6) 连接成功后,用户可通过客户端命令行执行以下命令: [1] ls 服务器返回当前目录文件列表(<file/dir> name size) [2] cd <dir> 进入指定目录(需判断目录是否存在,并给出提示) [3] get <file> 通过UDP下载指定文件,保存到客户端当前目录下 [4] bye 断开连接,客户端运行完毕 7) 服务器端支持多用户并发访问,不用考虑文件过大或UDP传输不可靠的问题。
资源推荐
资源详情
资源评论



















收起资源包目录














共 9 条
- 1
资源评论

- kbtx2019-11-13程序有点小问题,不过修改修改还是能用的
- Jwilliams2018-12-12节省一部分工作
- Hermit_20092018-07-30节省一部分工作,有帮助,谢谢

qq_35757634
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


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