`
郑云飞
  • 浏览: 818346 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于TCP协议的文件传输

阅读更多
/**
 * @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报文进行传输。由于TCP的可靠传输特性,即使在网络不稳定的情况下,也能...

    计算机网络课程设计 基于TCP协议的文件传输简单实现

    而"FTP"可能是指FTP(File Transfer Protocol),这是一个基于TCP协议的文件传输协议,虽然我们这里讨论的是自定义的简单实现,但FTP是一个很好的参考标准,因为它已经处理了许多文件传输中的复杂问题,如断点续传、...

    基于TCP协议的文件传输编程

    基于TCP协议、c语言、socket套接字编程、文件指针读写操作的文件传输程序,基于s/c架构,运行环境是VC++6.0 ,dos界面的控制台应用程序。实现功能是,从局域网一台主机传输文件到另一台主机。代码简单有注解,亲测...

    C#开发的基于TCP的文件传输.rar

    总的来说,C#结合WinForm和TCP协议可以构建功能强大的文件传输系统。通过理解TCP的工作原理和掌握C#的Socket编程,开发者能够实现高效、可靠的文件传输应用。这个示例项目提供了一个学习和参考的基础框架,你可以在...

    基于TCP的文件传输系统

    本篇文章将详细探讨如何基于TCP协议实现一个文件传输系统,包括TCP协议的基础、文件上传的基本流程以及Socket类和TcpClient类的使用。 首先,TCP协议是一种面向连接的协议,它在数据传输前会建立一个可靠的连接,...

    VC++ WbQQ多用户聊天、文件传输(基于TCP协议)

    文件传输功能同样基于TCP协议,采用断点续传技术,可以确保大文件在传输过程中不会因为网络问题而中断,提高了文件分享的效率和成功率。 在VC++环境下,开发这样的系统需要熟练掌握Winsock库,这是Microsoft为...

    TCP协议文件传输

    在这个“TCP协议文件传输”的主题下,我们将深入探讨TCP在文件传输中的应用,特别是与Java编程语言相结合的实现。 首先,TCP协议的特点是建立连接、数据分片、错误检测和重传机制。在文件传输中,TCP通过三次握手...

    基于TCP的文件传输实验报告.pdf

    总的来说,这个实验报告详细介绍了基于TCP的文件传输系统的设计与实现,涵盖了TCP协议的基础知识,Winsock控件的使用,以及C/S架构下文件传输的实现方法。通过这样的实践,学生可以掌握网络编程的关键技术和提高问题...

    C++实现的TCP协议的文件传输

    本话题主要关注如何使用C++语言实现TCP协议进行文件传输。C++作为一种强大的编程语言,其丰富的库函数和面向对象特性使得实现这样的功能变得可能。 首先,我们要理解TCP协议的基本工作原理。TCP协议是一种面向连接...

    QT实现基于TCP协议的文件传输

    总的来说,"QT实现基于TCP协议的文件传输"这个主题涵盖了网络编程、文件操作和QT框架的使用。通过学习和实践这一部分,开发者可以更好地理解和掌握网络通信的基本原理以及在QT环境中如何实现可靠的数据交换,这对于...

    c#基于TCP的文件传输,可实现传送多个文件,选择保存路径

    本资源以C#编程语言为基础,利用TCP协议实现了文件的传输功能,能够支持发送多个文件,并允许用户自定义保存路径,具有较高的实用价值。 首先,我们要理解TCP的基本概念。TCP是一种面向连接的协议,它在数据传输前...

    基于TCPUDP的文件传输

    本项目“基于TCP/UDP的文件传输”着重探讨了如何利用这两种协议进行文件的可靠传输,特别是在实现UDP的可靠性方面。 TCP是一种面向连接的协议,它提供了可靠的、基于字节流的数据传输服务。TCP通过三次握手建立连接...

    基于TCP协议的简单即时通信软件的设计与实现(含源文件).pdf

    在基于TCP协议的即时通信软件设计中,通常采用C/S(Client/Server)架构,即客户端(Client)和服务器端(Server)的模式。服务器负责处理客户端的登录验证、存储用户的好友信息,并定期发送心跳包来保持连接状态。...

    基于TCP协议的简单即时通信软件的设计与实现

    "基于TCP协议的简单即时通信软件的设计与实现" 本文主要介绍了基于TCP协议的简单即时通信软件的设计与实现,旨在设计一个能够处理多用户进行实时、安全的即时通信系统。本系统采用C/S模式,服务器负责客户端的登录...

    基于TCP的文件传输器

    "基于TCP的文件传输器"是一个典型的网络编程项目,通常在计算机科学或IT相关的课程设计中出现,如"Windows网络与通信"课程。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它是互联网上...

    基于TCP协议实现P2P

    基于TCP协议实现P2P聊天程序可以使用C#语言来编写,通过新建类MethodsList来处理所有的方法,并使用TcpListener和NetworkStream来实现网络通信和数据传输。但是,我们需要注意到P2P网络的特点和安全问题,以确保程序...

    基于TCP协议的网络通信

    【压缩包子文件的文件名称列表】:案例十一 基于TCP协议的网络通信 这个文件很可能是包含了一系列的VB.NET源代码文件,可能包括服务端项目和客户端项目,每个项目可能包含以下关键组件: 1. `Server` - TCP服务端...

    基于TCP模拟文件传输系统

    "在linux上编写文件上传下载的客户端和服务器,使用TCP协议。 1.可随时查看上传下载进度,可随时添加和删除上传下载任务,可随时停止或者继续上传下载; 2. 确保上传下载的文件的正确性和完整性; 3. 多客户端同时...

    基恩士固定扫码枪 获取条码信息 基于TCP协议 基于串口com协议 基恩士基于Socket协议获取条码信息 源代码

    基恩士固定扫码枪 获取条码信息 基于TCP协议 基于串口协议 基恩士基于Socket协议获取条码信息 基恩士基于串口COM协议获取条码信息,TCP、串口都支持放心使用 基恩士固定扫码枪喜欢使用socket通信是因为: 高效稳定:...

    基于TCP协议网上聊天程序.pdf

    基于TCP协议网上聊天程序设计 基于TCP协议网上聊天程序设计是计算机网络课程设计的一部分,旨在设计一个基于TCP协议的网上聊天程序。该设计包括系统设计目标、系统分析、总体设计、详细设计等几个部分。 系统设计...

Global site tag (gtag.js) - Google Analytics