声明
本代码的文件夹传输并非完全由本人完成,本人只是在实现递归的基本思想上,稍微处理与改动了原作者的代码的结构,从而实现了文件与文件夹传输。
基本思想:
1、通过递归的形式,创造方便区分开识别文件与文件夹的方法。
2、基于原作者的字符识别的思想,在服务器端可以识别接收文件或文件夹。
其他方法
组合设计模式实现,网上一大把,自己改吧!
客户端:
package My_File_TCP;
import java.io.*;
import java.net.*;
public class MyClient{
Socket client;
boolean flag=true;
FileInputStream fis;//此输入流负责读取本机上要传输的文件
DataOutputStream dos;//此输出流负责向另一台电脑(服务器端)传输数据
DataInputStream dis;//此输入流负责读取另一台电脑的回应信息
public static void main(String[] args) throws Exception{
new MyClient().ClientStart();
}
public void ClientStart() throws Exception{
try{
client=new Socket("127.0.0.1",8080);//服务器端的IP,(这个只是在局域网内的)我的是这个,你的根据实际而定
System.out.println("已连接");
dos=new DataOutputStream(client.getOutputStream());
dis=new DataInputStream(client.getInputStream());
String sc = "E:\\javatest_repositories";//这里你可以直接写成文件夹的路径或文件的路径
File fi1=new File(sc);
if(fi1.isDirectory()){//识别一开始你的是不是文件。是就以递归的形式,发送给服务端
copydirectory(fi1,sc);
}else if(fi1.isFile()){//如果你发送的是文件,那么就发给服务端
String str1=sc.substring(0,sc.lastIndexOf("\\"));
System.out.println(str1);
copyfile(fi1,str1,dos,dis);
}else{//加入错误提示
System.out.println("请认真输入路径");
}
String s="/]00";//提示传输完毕的标记
byte b[]=s.getBytes();
dos.write(b,0,s.length());
dos.flush();
}catch(Exception e){
System.out.println("Error");
}
}
public void copyfile(File file,String ss1,DataOutputStream dos1,DataInputStream dis1){
byte buff[];
String str;
int ti;
try{
fis=new FileInputStream(file);
str="/]0c"+(file.getPath().replace(ss1,""));//这是一个文件的名称
buff=str.getBytes();
dos1.write(buff);
dos1.flush();
dis1.read();
dos1.writeInt(fis.available());//传输一个整型值,指明将要传输的文件的大小
dos1.flush();
dis1.read();
buff=new byte[10000];
while(fis.available()>0){//开始传送文件
ti=fis.read(buff);
dos1.write(buff,0,ti);
dos1.flush();
}
dos1.flush();
fis.close();
dis1.read();
}catch(Exception e){
e.printStackTrace();
}
}
public void copydirectory(File f,String ss)throws Exception{//这是传输的核心,而且将被递归
byte b[]=null;
String ts=null;
for(File f1:f.listFiles()){ //首先通过if语句判断f1是文件还是文件夹
if(f1.isDirectory()){ //fi是文件夹,则向服务器端传送一条信息
ts="/]0f"+(f1.getPath().replace(ss,""));//"/]0f"用于表示这条信息的内容是文件夹名称
b=ts.getBytes();
dos.write(b);
dos.flush();
dis.read();
copydirectory(f1,ss);//由于f1是文件夹(即目录),所以它里面很有可能还有文件或者文件夹,所以进行递归
}else{
copyfile(f1,ss,dos,dis);
}
}
}
}
服务端:
package My_File_TCP;
import java.io.*;
import java.net.*;
public class MyServer{
ServerSocket server=null;
Socket client=null;
boolean flag=true;
DataInputStream dis;
DataOutputStream dos;
public static void main(String[] args){
new MyServer().ServerStart();
}
public void ServerStart(){
try{
server=new ServerSocket(8080);
System.out.println("端口号:"+server.getLocalPort());
client=server.accept();//等待接收
System.out.println("连接完毕");
dis=new DataInputStream(client.getInputStream());
dos=new DataOutputStream(client.getOutputStream());
try{
Copy(dis,dos);
}catch(Exception e){
e.printStackTrace();
}finally{
client.close();
server.close();
}
}catch(IOException e){
System.out.println("Error");
}
}
public void Copy(DataInputStream dis1,DataOutputStream dos1) throws Exception{
String answer="g";
byte ans[]=answer.getBytes();
byte b[]=new byte[1000];
int ti;
int count1=0;//计算收到文件夹的次数
int count2=0;//计算收到文件的次数
new File("e:\\2").mkdirs();
FileOutputStream fos;
while(flag){
ti=dis1.read(b);
dos1.write(ans);
String select=new String(b,0,ti);
if(select.contains("/]0f")){//识别文件夹
File f=new File("e:\\2\\"+(select.replace("/]0f","")));//去掉标识
count1++;
System.out.println("creat directory "+count1+" times");
f.mkdirs();
}else if(select.contains("/]0c")){//识别文件
fos=new FileOutputStream("e:\\2\\"+(select.replace("/]0c","")));
int tip=dis1.readInt();
dos1.write(ans);
while(tip>0){
ti=dis1.read(b,0,(tip>1000?1000:tip));
tip=tip-ti;
String cs=new String(b,0,4);
fos.write(b,0,ti);
}
count2++;
fos.flush();
fos.close();
dos1.write(ans);
System.out.println("creat file "+count2+" times");
}else if(select.contains("/]00")){
flag=false;//彻底结束的标志
System.out.println("creat successfully");
}
}
dis1.close();
}
}
参考的代码的地址:
https://zhidao.baidu.com/question/112118386.html