/**
* @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("连接服务器失败!" + "");
}
}
}
分享到:
相关推荐
计算机网络课程设计 基于TCP协议文件传输简单实现
基于TCP协议、c语言、socket套接字编程、文件指针读写操作的文件传输程序,基于s/c架构,运行环境是VC++6.0 ,dos界面的控制台应用程序。实现功能是,从局域网一台主机传输文件到另一台主机。代码简单有注解,亲测...
c#开发的winform应用程序,基于tcp的文件传输demo,分服务器端和客户端,仅供学习和参考。
利用TCP协议实现文件的上传,即使用Socket类或TcpClient类,实现文件的上传。
该段代码用QT实现了基于TCP协议的文件传输,主要用于学习
"在linux上编写文件上传下载的客户端和服务器,使用TCP协议。 1.可随时查看上传下载进度,可随时添加和删除上传下载任务,可随时停止或者继续上传下载; 2. 确保上传下载的文件的正确性和完整性; 3. 多客户端同时...
基于TCP协议传输文字消息和文件,分为服务器和客户端两个部分
基于双协议(TCP\UDP)的文件传输,并实现了UDP的可靠性
可以说很多安全数据的传输通信都是基于tcp协议进行的。 为了让tcp通信更加方便需要引入一个socket模块(将网络层、数据链路层、物理层封装的模块),我们只要调用模块中的相关接口就能实现传输层下面的繁琐操作。 ...
两个用户如果同时在线,采用点到点通信方式进行聊天,信息不需要通过服务器中转,服务器也不保存(基于TCP协议); 支持离线消息(基于TCP协议); 支持点到点可靠文件传输(基于UDP协议); 存储在服务器端的数据...
软件组成:注册登录服务器、聊天通信服务器、客户端三部分,使用之前:注册ODBC数据源;数据源名称:wbQQuser;类型:ACCESS;文件名:wbQQuser.mdb。
使用C++语言编写基于TCP协议的C/S传输文件。具体使用方法见里面的report。
通过Linux C编程,设计一个基于TCP/IP的文件传输系统,实现服务器端和客户端之间网络文件的收发。
使用Windows Socket API 实现一个基于TCP协议的文件传输工具
包含了QT5的文件传输Demo,基于TCP通信的客户端、服务端。QtCreator下使用MinGW编译可直接运行。
基于TCP协议实现的文件传输,分为发送端和接收端,可视化显示传输进度
做的一个基于TCP协议的聊天程序,有两份代码,一份加了文件(最后也没实现文件传输),一份没加上。不过实现了如下功能: 1.在linux下实现网络聊天,包括群聊,一对一私聊等功能。 2.实现客户间的文件传输(做了个...
本项目利用tcp协议在windows和linux之间传递文件,windows下实现服务器端,linux下实现客户端。此程序可以方便用户在windows和linux之间快速的传递文件,在局域网下传输速度可以达到8MB/s。
VB中基于TCP/IP协议的点对点文件传输