学堂 学堂 学堂公众号手机端

基于TCP协议的文件传输

lewis 12个月前 (05-13) 阅读数 21 #技术


/**
* @author 郑云飞
* 日期:2010年08月18日1:26
* 内容:基于TCP协议的文件传输
* 服务器端程序
*/
package socketFile;
import java.io.*;
import java.net.*;
public class Server extends Thread
{
File fi;
DataOutputStream ps ;
String filePath;
BufferedReader in;
public void run()
{
Socket s=null;
try
{
ServerSocket ss = new ServerSocket(8888);
System.out.println("服务器启动");
while (true)
{
boolean isExist=true;//循环的标志
s = ss.accept();//一直出于阻塞状态,直到有客户连接
while(isExist)
{
isExist=false;
System.out.println("与客户端成功建立连接");
in=new BufferedReader(new InputStreamReader(s.getInputStream()));//从客户端获取信息
filePath=in.readLine();//将从客户端读取到的信息赋给变量filePath
fi= new File(filePath);//用刚才的字符串变量创建一个文件
boolean flag=fi.exists();//判断文件是否存在
ps=new DataOutputStream(s.getOutputStream());
ps.writeBoolean(flag);//将文件是否存在的标志写入流ps中,发送给客户端
ps.flush();//刷新缓冲流
if(flag==false)
{
isExist=true;
}
else
{
System.out.println("文件长度:" + (long) fi.length());
DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));

// 将文件名及长度传给客户端。
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((long) fi.length());
ps.flush();
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
int read = 0;
while ((read = fis.read(buf))!=-1)
{
ps.write(buf, 0, read);
}
ps.flush();
// 注意关闭socket链接哦,不然客户端会等待server的数据过来,
// 直到socket超时,导致数据不完整。
fis.close();
s.close();
System.out.println("文件传输完成");
}

}

}

}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
new Server().start();
}
}

/**
* @author 郑云飞
* 日期:2010年08月18日1:26
* 内容:基于TCP协议的文件传输
* 客户端程序
*/
package socketFile;
import java.io.*;
import java.net.Socket;
public class Client
{
public static void main(String arg[])
{
Socket cs;

DataInputStream dis;
try
{
cs = new Socket("localhost", 8888);
String savePath = "F:/";
System.out.print("连接服务器成功!" + "");
boolean fileFlag=true;//判断是否循环输入的标志,如果文件路径存在,返回true,否则返回false
while(fileFlag)
{
fileFlag=false;
System.out.println("请选择要下载的东西:");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//从键盘输入文件的路径
String filePath=br.readLine();//将从键盘输入的文件路径赋给变量filePath
//将从键盘输入的文件路径写入到pw中,返回给服务器端
PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(cs.getOutputStream())),true);
pw.println(filePath);//将文件的路径写入流pw中,返回给服务器端
dis=new DataInputStream(cs.getInputStream());
boolean isExist=dis.readBoolean();//读取服务器端返回来的文件是否存在的标志
if(isExist==false)
{
fileFlag=true;
}
else
{
dis = new DataInputStream(new BufferedInputStream(cs.getInputStream()));
// 本地保存路径,文件名会自动从服务器端继承而来。
long passedlen = 0;
long len = 0;
savePath += dis.readUTF();//读取文件的保存路径
DataOutputStream fileout = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));
len = dis.readLong();//读取文件的长度
System.out.println("文件的长度为:" + len + "");
System.out.println("开始接收文件!" + "");
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
int read = 0;
while ((read = dis.read(buf))!=-1)
{
passedlen += read;
// 下面进度条本为图形界面的prograssBar做的,这里如果是打文件,
// 可能会重复打印出一些相同的百分比
System.out.println("文件接收了" + (passedlen * 100 / len) + "%");
fileout.write(buf, 0, read);
}
//注意必须关闭文件输出流,否则接收到的数据为空
if(fileout!=null)
{
fileout.close();
}
System.out.println("接收完成,文件存为" + savePath + "");
}
}
}
catch (Exception ex)
{
System.out.print("连接服务器失败!" + "");
}
}
}


版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门