/**
* @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协议来实现文件的发送和接收。在这样的系统中,文件会被分割成若干小的数据块,每个数据块作为一个独立的TCP报文进行传输。由于TCP的可靠传输特性,即使在网络不稳定的情况下,也能...
而"FTP"可能是指FTP(File Transfer Protocol),这是一个基于TCP协议的文件传输协议,虽然我们这里讨论的是自定义的简单实现,但FTP是一个很好的参考标准,因为它已经处理了许多文件传输中的复杂问题,如断点续传、...
基于TCP协议、c语言、socket套接字编程、文件指针读写操作的文件传输程序,基于s/c架构,运行环境是VC++6.0 ,dos界面的控制台应用程序。实现功能是,从局域网一台主机传输文件到另一台主机。代码简单有注解,亲测...
总的来说,C#结合WinForm和TCP协议可以构建功能强大的文件传输系统。通过理解TCP的工作原理和掌握C#的Socket编程,开发者能够实现高效、可靠的文件传输应用。这个示例项目提供了一个学习和参考的基础框架,你可以在...
本篇文章将详细探讨如何基于TCP协议实现一个文件传输系统,包括TCP协议的基础、文件上传的基本流程以及Socket类和TcpClient类的使用。 首先,TCP协议是一种面向连接的协议,它在数据传输前会建立一个可靠的连接,...
文件传输功能同样基于TCP协议,采用断点续传技术,可以确保大文件在传输过程中不会因为网络问题而中断,提高了文件分享的效率和成功率。 在VC++环境下,开发这样的系统需要熟练掌握Winsock库,这是Microsoft为...
在这个“TCP协议文件传输”的主题下,我们将深入探讨TCP在文件传输中的应用,特别是与Java编程语言相结合的实现。 首先,TCP协议的特点是建立连接、数据分片、错误检测和重传机制。在文件传输中,TCP通过三次握手...
总的来说,这个实验报告详细介绍了基于TCP的文件传输系统的设计与实现,涵盖了TCP协议的基础知识,Winsock控件的使用,以及C/S架构下文件传输的实现方法。通过这样的实践,学生可以掌握网络编程的关键技术和提高问题...
本话题主要关注如何使用C++语言实现TCP协议进行文件传输。C++作为一种强大的编程语言,其丰富的库函数和面向对象特性使得实现这样的功能变得可能。 首先,我们要理解TCP协议的基本工作原理。TCP协议是一种面向连接...
总的来说,"QT实现基于TCP协议的文件传输"这个主题涵盖了网络编程、文件操作和QT框架的使用。通过学习和实践这一部分,开发者可以更好地理解和掌握网络通信的基本原理以及在QT环境中如何实现可靠的数据交换,这对于...
本资源以C#编程语言为基础,利用TCP协议实现了文件的传输功能,能够支持发送多个文件,并允许用户自定义保存路径,具有较高的实用价值。 首先,我们要理解TCP的基本概念。TCP是一种面向连接的协议,它在数据传输前...
本项目“基于TCP/UDP的文件传输”着重探讨了如何利用这两种协议进行文件的可靠传输,特别是在实现UDP的可靠性方面。 TCP是一种面向连接的协议,它提供了可靠的、基于字节流的数据传输服务。TCP通过三次握手建立连接...
在基于TCP协议的即时通信软件设计中,通常采用C/S(Client/Server)架构,即客户端(Client)和服务器端(Server)的模式。服务器负责处理客户端的登录验证、存储用户的好友信息,并定期发送心跳包来保持连接状态。...
"基于TCP协议的简单即时通信软件的设计与实现" 本文主要介绍了基于TCP协议的简单即时通信软件的设计与实现,旨在设计一个能够处理多用户进行实时、安全的即时通信系统。本系统采用C/S模式,服务器负责客户端的登录...
"基于TCP的文件传输器"是一个典型的网络编程项目,通常在计算机科学或IT相关的课程设计中出现,如"Windows网络与通信"课程。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它是互联网上...
基于TCP协议实现P2P聊天程序可以使用C#语言来编写,通过新建类MethodsList来处理所有的方法,并使用TcpListener和NetworkStream来实现网络通信和数据传输。但是,我们需要注意到P2P网络的特点和安全问题,以确保程序...
【压缩包子文件的文件名称列表】:案例十一 基于TCP协议的网络通信 这个文件很可能是包含了一系列的VB.NET源代码文件,可能包括服务端项目和客户端项目,每个项目可能包含以下关键组件: 1. `Server` - TCP服务端...
"在linux上编写文件上传下载的客户端和服务器,使用TCP协议。 1.可随时查看上传下载进度,可随时添加和删除上传下载任务,可随时停止或者继续上传下载; 2. 确保上传下载的文件的正确性和完整性; 3. 多客户端同时...
基恩士固定扫码枪 获取条码信息 基于TCP协议 基于串口协议 基恩士基于Socket协议获取条码信息 基恩士基于串口COM协议获取条码信息,TCP、串口都支持放心使用 基恩士固定扫码枪喜欢使用socket通信是因为: 高效稳定:...
基于TCP协议网上聊天程序设计 基于TCP协议网上聊天程序设计是计算机网络课程设计的一部分,旨在设计一个基于TCP协议的网上聊天程序。该设计包括系统设计目标、系统分析、总体设计、详细设计等几个部分。 系统设计...