精华内容
下载资源
问答
  • Netty 大文件传输
    千次阅读
    2020-10-30 18:50:53

    Netty 大文件传输

    使用netty进行大文件传输,对文件大小没有限制
    
    实际上,传输的是文件分片,分片大小自定义
    

    整体思路

    1. 客户端一连上服务器,即发送指定文件的文件分片
    2. 服务器收到分片后,写入指定路径,并向客户端返回所收到字节数(即通知客户端下次从文件的此字节开始传输)
    3. 客户端收到服务器的回应后,从指定字节开始创建下一个文件分片 继续发送给服务器,若已到文件末尾,则发送-1表示文件传输结束
    4. 服务器循环步骤2,直至收到客户端发来的-1,也回应给客户端-1表示收到传输结束的通知
    5. 客户端在收到-1后,断开与服务器的连接

    代码实现

    1. 客户端
    /**
     * @ClassName: ClientHandler   
     * @Description: 客户端的处理器,在在client.ClientInitializer initChannel中被调用   
     * @author Stan
     * @date: 2020年3月24日
     */
    public class ClientHandler extends ChannelInboundHandlerAdapter{
    
    	private static final Logger logger = Logger.getLogger(ClientHandler.class.getName());
    	
    	private int byteRead;					//一次读取的字节
    	private volatile int start = 0;			//文件当前读取位置
    	private volatile int lastLength = 0;	//单次文件传输剩余长度
    	private RandomAccessFile file;			
    	private FileConfig fc;
    	
    	public ClientHandler(FileConfig fc) {
    		if(fc.getFile().exists()) {
    			if(!fc.getFile().isFile()) {
    				logger.info("error:" + fc.getFile() + "is not a file!");
    				return;
    			}
    		}
    		this.fc = fc;
    	}
    
    	/**
    	 * @Description:
    	 * 		连接一激活就向服务器发送文件,发送文件的函数在这里修改
    	 * 		若文件可一次传输完,则只调用本方法,否则调用一次本方法后,其余在channelRead中传输
    	 * 	   
    	 * @param ctx
    	 * @throws Exception   
    	 * @see io.netty.channel.ChannelInboundHandlerAdapter#channelActive(io.netty.channel.ChannelHandlerContext)
    	 */
    	@Override
    	public void channelActive(ChannelHandlerContext ctx) throws Exception{
    		
    		file = new RandomAccessFile(fc.getFile(), "r");
    		
    		send0(ctx, start);
    	}
    	
    	/**
    	 * @Description: 服务器通知已接受到的字节数,客户端收到通知并传输剩余文件
    	 * @param ctx
    	 * @param msg
    	 * @throws Exception   
    	 * @see io.netty.channel.ChannelInboundHandlerAdapter#channelRead(io.netty.channel.ChannelHandlerContext, java.lang.Object)
    	 */
    	@Override
    	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    		//收到服务器发来的字节数
    		if(msg instanceof Integer) {
    			start = (Integer)msg;
    					
    			if(start != -1) {	//文件没有传完
    				logger.info("服务器已收到字节数:" + start);
    				
    				send0(ctx, start);
    				
    			}else {
    				file.close();
    				logger.info("服务器已接收全部文件");
    				// 服务器接收完文件就与客户端断开连接
    				ctx.close();
    			}
    		}
    	}
    	
    	/**
    	 * @throws Exception 
    	 * @Description: 具体处理发送  
    	 */
    	private void send0(ChannelHandlerContext ctx, int start) throws Exception {
    		// 文件没有传完
    		if (start != -1) { 
    
    			file.seek(start); // 把文件的记录指针定位到start字节的位置。也就是说本次将从start字节开始读数据
    
    			int nowLength = (int) (file.length() - start); 			// 文件当前总剩余长度
    			int transferLength = FileConfig.getTransferLength(); 	// 自定义的单次传输长度
    			
    			lastLength = nowLength<transferLength ? nowLength:transferLength;	// 选取较短一方作为单次文件传输剩余长度
    			
    			transfer(ctx, lastLength);
    		}
    	}
    	
    	/**
    	 * @Description: 完成单次传输  
    	 * @param ctx
    	 * @param length	单次传输长度
    	 * @throws Exception
    	 */
    	private void transfer(ChannelHandlerContext ctx, int length) throws Exception {
    		byte[] buf = new byte[length];
    
    		if ((byteRead = file.read(buf)) != -1 && length > 0) {
    			fc.setEndPos(byteRead);
    			fc.setFileBuf(buf);
    		} else {
    			fc.setEndPos(-1);	//结束位置-1,表示文件传输结束
    			fc.setFileBuf(null);
    			logger.info("文件已上传完毕");
    		}
    		
    		ctx.writeAndFlush(fc);
    	}
    	
    	@Override
    	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    		cause.printStackTrace();
    		ctx.close();
    	}
    }
    
    1. 服务器
    /**
     * @ClassName: ServerHandler   
     * @Description: 服务器端的处理器,在server.ServerInitializer initChannel中调用 
     * @author Stan
     * @date: 2020年3月24日
     */
    public class ServerHandler extends ChannelInboundHandlerAdapter{
    	
    	private static final Logger logger = Logger.getLogger(ServerHandler.class.getName());
    	
    	private int byteRead;
    	private int start = 0;
    	
    	/**
    	 * @Description: 服务器接收到消息后进入这个方法,接收文件的函数在这里修改
    	 * @param ctx
    	 * @param msg
    	 * @throws Exception   
    	 * @see io.netty.channel.ChannelInboundHandlerAdapter#channelRead(io.netty.channel.ChannelHandlerContext, java.lang.Object)
    	 */
    	@Override
    	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    		
    		//如果传递过来的是文件或文件分片
    		if(msg instanceof FileConfig) {			
    			FileConfig fc = (FileConfig)msg;
    			
    			byte[] fileBuf = fc.getFileBuf();	//接收到的文件字节数组
    			byteRead = fc.getEndPos();			//记录当前文件传输结束的位置
    			
    			if(byteRead == -1) {	// 约定的结束的标志
    				fileEnd(ctx);
    				
    			}else {
    				
    				if(byteRead > 0) {
    					// TODO 文件接收路径需要指定
    					RandomAccessFile file = new RandomAccessFile(new File("test2.txt"), "rw");	
    					file.seek(start);	//把文件的记录指针定位到start字节的位置。也就是说程序本次将从start字节开始写数据
    					file.write(fileBuf);//把传输过来的数据写进文件里
    					
    					start += byteRead;	//确保文件下次能从当前结束的地方继续读取
    					
    					ctx.writeAndFlush(start);	//向客户端通知下次从第start字节开始传输
    					file.close();
    					
    					logger.info("服务器已接收字节数:" + start + ",客户端地址:" + ctx.channel().remoteAddress());
    					
    				}else {	
    					exceptionCaught(ctx, new Throwable("可读字节小于0"));
    				}
    			}
    		}
    	}
    	
    	/**
    	 * @Description: 文件接收完毕  
    	 * @param ctx
    	 */
    	private void fileEnd(ChannelHandlerContext ctx) {
    		ctx.writeAndFlush(-1);
    		logger.info("服务器接收文件完毕"
    				+ "\n文件来源:"+ ctx.channel().remoteAddress() 
    				+ "\n文件大小:" + start + " 字节");
    	}
    	
    	@Override
    	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    		ctx.close();
    	}
    	
    }
    
    更多相关内容
  • C#SOCKET大文件传输.zip

    2020-05-16 14:23:54
    C# 实现的SOCKET大文件传输,支持高并发,断点续等,是学习SOCKET通信的经典案例,走过路过不要错过!!!!!!
  • 基于socket UDP协议实现文件传输(windows vc++源代码) UDP1GB的文件仅需15秒 该代码包含 根据文件内容长度生成MD5码,以供校验文件完整性 本代码包含windows vc++编写dll的代码
  • 服务器:设置IP 端口,监听,连接,传输文件名字(转2进制),传输文件(2进制),结束,关闭tcpListener 客户端:设置IP 端口,连接,接受文件名字,接受文件,写文件,结束,关闭tcpListener
  • 大型文件传输

    千次下载 热门讨论 2011-12-18 16:32:27
    自己写的实现大型文件传输的例子,完整的工程。运行比较稳定,发送采用多线程实现,,局域网的测试发送速度在6.2M每秒。
  • java socket 大文件传输,快速传输, 数据包的分片,组装,涉及UDP,TCP传输技术,NIO非阻塞等等,适合对socket编程进一步学习的同学
  • C#socket 大文件传输 分段传输 C#DEMO
  • 本程序是自己为公司服务器备份文件迁移写的一个基于socket TCP协议的大文件传输应用程序。代码实现了基本流程,后期还有更改和优化。先把前期demo上传以流自己以后学习。如大家有需要可以下载一起探讨。
  • 分为两个文件,一个是server端负责获取YAML中文件信息,用SOKET进行文件传输(TCP+三次握手),另外一个是client端利用服务器端过来的文件信息做校验,并继续文件接收
  • C# webservice大文件传输实例源码

    热门讨论 2013-11-17 15:35:42
    下载后会有2个文件一个 UpFile模拟上传客户端, WebServer模拟服务器接收端。 环境是VS2010.
  • TCP/IP协议下的文件传输(包括超过4G的文件) 支持断点续
  • 四种常用的大文件传输方法

    千次阅读 2021-08-02 10:18:35
    一般大小的文件可以用QQ或者微信的文件传输助手来解决,或者任意一个邮箱也是可以实现的,但如果文件大小过,传输就有一定问题。接下来,介绍几种工作、生活中常用的传输文件的简单方法。1.QQ/微信文件传输助手...

    文件传输作为日常生活、工作中需求量较高的一项功能,工作中总会遇到需要将文件从一个设备转移到另一个设备上查看、存储,或者将资料回传的情况。一般大小的文件可以用QQ或者微信的文件传输助手来解决,或者任意一个邮箱也是可以实现的,但如果文件大小过大,传输就有一定问题。

    c89c41ca8f022da188612d9042ecd4b6.png

    接下来,介绍几种工作、生活中常用的传输文件的简单方法。

    1.QQ/微信文件传输助手

    之前只是QQ上可以,现在微信也有了。这个主要是手机端与网页版之间传输文件,前提是登陆的账号是同一个,传输文件大小限制在2G以下。

    笔者亲自试过,超过1G的文件,传输速度会变得非常缓慢,更适合1G以下的文件传输,主要是方便。

    由于QQ/微信本身的私密性,这种传输方法并不适用于大范围的传输,传播人数受限,因此更适合个人使用。

    2. FileZilla

    这是个免费使用的ftp的客户端,主要适用于windows系统,mac并不适用。

    主要原理其实就是传统的ftp的局域网传输,只不过与之前需要自己搭建服务器相比,FileZilla提供的客户端要简便许多。操作也很简单,基本上看一遍就能会。

    比较好的一点是,FileZilla可以实现多个文件的同时收发,速度就要看你所在的网络环境来决定了。

    有一点不好的是,FileZilla后期的更新与维护还是需要专人来弄,这个也是所有FTP软件的共同点了。当然FTP在使用上也会受到地域的限制,无法做到实时传输,只能在指定的机器上完成这一项操作。

    用云盘来传输文件的好处就是可以实现多个终端文件的互通。大文件秒传做的比较出彩的应该算是百度网盘了,仅限于开了超级会员的,免费版的速度还是一言难尽。

    其次,

    另外,跨国传输是联想企业网盘主打的一项功能,得益于联想在全球建立的大量数据中心,跨国传输做的还是可以的。

    4. 专用的文件传输软件

    云盘这种除了文件传输之外还兼顾文件协作等一系列功能,专用的文件传输软件相对来说功能比较单一,专注于文件传输这一项功能。适合那些有

    anyShare分享:

    分享到微信×

    打开微信,点击底部的“发现”,

    使用“扫一扫”即可将网页分享至朋友圈。

    展开全文
  • 但是如果让我们自己写一个网络文件传输的程序,估计大家都傻眼了,今天小编就给大家以最简单的方式,让C#初学者能够快速开发出实用的Socket文件传输程序。 温馨提示:在看本篇之前首先得有socket编程,也就是能收发...


    一、序言

    1.1 文件传输协议兼容性

    RRQM文件传输使用的是特殊传输协议,与FTP,HTTP等协议完全不兼容,所以如果使用文件传输,则服务器与客户端必须均使用RRQM组件。

    1.2 与FTP相比

    因为RRQM使用的是特殊协议,所以性能、功能上要远强于FTP,且搭建简单,支持多通道传输等。

    1.3 特点

    • 简单易用。
    • 多线程处理。
    • 高性能,实测传输速度可达1000Mb/s
    • 超简单的传输限速设置,1k-10Gb 无级调节。
    • 超简单的传输速度、传输进度获取。
    • 随心所欲的暂停、继续、停止传输。
    • 系统化的权限管理,让敏感文件只允许私有化下载
    • RPC交互,让客户端和服务器交流不延迟。
    • 基于事件驱动,让每一步操作尽在掌握。
    • 超简单的断点续传设置,为大文件传输保驾护航。
    • 断网续传(企业版支持)
    • 已经上传的文件,再次上传时,可实现快速上传
    • 极少的GC释放。

    演示: 可以看到,下图正在上传一个Window的系统镜像文件,大约4.2Gb,传输速度已达到800Mb/s,GC基本上没有释放,性能非常强悍(中间有稍微停顿,因为程序在获取文件MD5值)。

    在这里插入图片描述


    二、程序集源码、Demo下载

    2.1 源码位置

    2.2 Demo位置

    2.3 Config配置详解

    【RRQM系】Config配置及其他配置信息介绍

    三、安装

    安装RRQMSocket.FileTransfer即可,具体步骤详看链接博客。

    VS、Unity安装和使用Nuget包

    四、创建FileService

    4.1 说明

    FileService服务器是继承自TcpRpcParser的,这意味着您可以用它实现RPC的任意交互,和协议数据的发送。

    4.2 创建FileService

    FileService fileService = new FileService();
    
    //声明配置
    var config = new FileServiceConfig();
    
    //继承TcpService配置
    config.ListenIPHosts = new IPHost[] { new IPHost(7790) };//同时监听两个地址
    config.VerifyToken = "FileServer";//连接验证令箭,可实现多租户模式
    try
    {
        fileService.Setup(config);
        fileService.Start();
        Console.WriteLine("启动成功");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    

    五、创建FileClient

    FileClient是继承于TcpRpcClient的,所有同样的,在文件传输的同时,也能进行RPC交互。

    private static FileClient CreateFileClientPro()
    {
        FileClient fileClient = new FileClient();
    
        //声明配置
        var config = new FileClientConfig();
    
        //继承TcpClient配置
        config.RemoteIPHost = new IPHost("127.0.0.1:7789");//远程IPHost
    
        //注入配置
        fileClient.Setup(config);
    
        try
        {
            //连接服务器
            fileClient.Connect("FileServer");
            Console.WriteLine("连接成功");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    
        return fileClient;
    }
    
    

    六、传输文件

    在建立连接后,Client与Service互相称为对点,此时,对点之间可以任意pull(拉取)、push(推送)文件。接收对点可以订阅BeforeFileTransferFinishedFileTransfer事件,来获取相关信息。值得注意的是,FinishedFileTransfer事件的触发并不意味着完成传输,具体结果还要通过Result属性值进行判断。

    下列以FileClient为例演示(服务器端为FileSocketClient)。

    6.1 Pull文件

    响应流程:

    1. 发起Pull请求。
    2. 远程对点触发BeforeFileTransfer事件。
    3. 返回文件信息,然后检验是否续传等,然后开始接收。
    4. 接收完成或异常。
    5. 远程对点触发FinishedFileTransfer事件。

    具体步骤:

    1. 成功Connect。
    2. 实例化FileRequest,然后进行相关设置。
    3. 实例化FileOperator,本次传输的控制器,用于获取传输进度、速度、状态等。
    4. 实例化可选参数Metadata,可以将信息传到服务器。
    5. 调用PullFile函数,阻塞等待返回。
    6. 通过返回值Result.ResultCode判断状态。
    FileClient fileClient = CreateFileClientPro();
    
    FileRequest fileRequest = new FileRequest(@"请求文件路径", $@"保存文件路径");
    fileRequest.Overwrite = true;//是否覆盖
    fileRequest.FileCheckerType = FileCheckerType.MD5;//进行MD5校验
    fileRequest.Flags = TransferFlags.BreakpointResume;//尝试断点续传
    
    FileOperator fileOperator = new FileOperator();//实例化本次传输的控制器,用于获取传输进度、速度、状态等。
    
    //此处的作用相当于Timer,定时每秒输出当前的传输进度和速度。
    LoopAction loopAction = LoopAction.CreateLoopAction(-1, 1000, (loop) =>
    {
        if (fileOperator.Result.ResultCode != ResultCode.Default)
        {
            loop.Dispose();
        }
    
        Console.WriteLine($"进度:{fileOperator.Progress},速度:{fileOperator.Speed()}");
    });
    
    loopAction.RunAsync();
    
    //fileOperator.SetMaxSpeed(1024);//开源版不支持该操作
    
    Metadata metadata = new Metadata();//传递到服务器的元数据
    metadata.Add("1", "1");
    metadata.Add("2", "2");
    
    //此方法会阻塞,直到传输结束,也可以使用PullFileAsync
    IResult result = fileClient.PullFile(fileRequest, fileOperator, metadata);
    
    

    6.2 Push文件

    响应流程:

    1. 发起Push请求。
    2. 远程对点触发BeforeFileTransfer事件。
    3. 返回文件信息,然后开始发送。
    4. 发送完成或异常。
    5. 远程对点触发FinishedFileTransfer事件。

    具体步骤:

    1. 成功Connect。
    2. 实例化FileRequest,然后进行相关设置。
    3. 实例化FileOperator,本次传输的控制器,用于获取传输进度、速度、状态等。
    4. 实例化可选参数Metadata,可以将信息传到服务器。
    5. 调用PushFile函数,阻塞等待返回。
    6. 通过返回值Result.ResultCode判断状态。
    FileClient fileClient = CreateFileClientPro();
    
    FileRequest fileRequest = new FileRequest(@"本地文件路径", $@"保存文件路径");
    fileRequest.Overwrite = true;//是否覆盖
    fileRequest.FileCheckerType = FileCheckerType.MD5;//进行MD5校验
    fileRequest.Flags = TransferFlags.BreakpointResume;//尝试断点续传
    
    FileOperator fileOperator = new FileOperator();//实例化本次传输的控制器,用于获取传输进度、速度、状态等。
    
    //此处的作用相当于Timer,定时每秒输出当前的传输进度和速度。
    LoopAction loopAction = LoopAction.CreateLoopAction(-1, 1000, (loop) =>
    {
        if (fileOperator.Result.ResultCode != ResultCode.Default)
        {
            loop.Dispose();
        }
    
        Console.WriteLine($"进度:{fileOperator.Progress},速度:{fileOperator.Speed()}");
    });
    
    loopAction.RunAsync();
    
    //fileOperator.SetMaxSpeed(1024);//开源版不支持该操作
    
    Metadata metadata = new Metadata();//传递到服务器的元数据
    metadata.Add("1", "1");
    metadata.Add("2", "2");
    
    //此方法会阻塞,直到传输结束,也可以使用PushFileAsync
    IResult result = fileClient.PushFile(fileRequest, fileOperator, metadata);
    
    

    七、获取传输进度、速度及取消传输任务

    因为Push和Pull方法支持多线程操作,这就意味着同一时间内,同一个TCP信道中可以同时进行多个文件的Push和Pull。所以如果想获得某个传输文件的速度或进度,则必须通过FileOperator进行获取,下面将以客户端作为发起端,Push文件视角示例演示。

    7.1 发起端获取传输进度、速度

    在传输接口PushFile(或PullFile)中,第二个参数即需要传入FileOperator类型的参数,在实例化该对象后调用该方法之前可以使用异步获取其数据。

    FileOperator fileOperator = new FileOperator();
    
    /*片段代码的作用是实时获取传输进度*/
    LoopAction loopAction = LoopAction.CreateLoopAction(-1, 1000, (loop) =>
    {
        if (fileOperator.Result.ResultCode != ResultCode.Default)
        {
            loop.Dispose();
        }
    
        Console.WriteLine($"进度:{fileOperator.Progress},速度:{fileOperator.Speed()}");
    });
    
    loopAction.RunAsync();
    /*片段代码的作用是实时获取传输进度*/
    
    
    //Task.Run(async () => //上述代码片功能可以用该代码片段代替
    //{
    //    while (true)
    //    {
    //        if (fileOperator.Result.ResultCode != ResultCode.Default)
    //        {
    //            break;
    //        }
    //        Console.WriteLine($"进度:{fileOperator.Progress},速度:{fileOperator.Speed()}");
    //        await Task.Delay(1000);
    //    }
    //});
    
    //传入元数据
    Metadata metadata = new Metadata();
    metadata.Add("1", "1");
    metadata.Add("2", "2");
    
    
    IResult result = fileClient.PushFile(fileRequest, fileOperator, metadata);
    Console.WriteLine(result);
    
    

    7.2 发起端取消传输任务

    同样的,操作应该作用于FileOperator。

    在文件传输期间,调用以下代码,取消传输。

    //此代码功能为取消传输任务
    fileOperator.SetCancellationTokenSource(new CancellationTokenSource());
    fileOperator.Cancel();
    

    7.3 发起端限速传输速度

    同样,在fileOperator中,直接设置即可。

    注意:该功能仅企业版支持,开源版为全速传输模式。

    fileOperator.SetMaxSpeed(1024);
    

    7.4 接收端获取传输相关信息

    在上述示例中,客户端是作为发起端,那服务器则是接收端,接收端获取传输的相关信息,也是通过FileOperator,不过,该对象不是自己实例化,而是由框架自己生成的。

    首先,接收端得订阅BeforeFileTransfer事件(或重写FileSocketClient.OnBeforeFileTransfer),然后通过事件参数e获取FileOperator实例对象。

    其他操作和发起端一致。

    FileService fileService = new FileService();
    
    fileService.BeforeFileTransfer += (client, e) =>
    {
        FileOperator fileOperator = e.FileOperator;
    };
    

    在这里插入图片描述

    八、批量文件传输

    文件传输支持批量传输,调用以下扩展方法即可:

    multipleCount:是同时传输的量。

            public static void PullFiles(this IFileClientBase client, int multipleCount, FileRequest[] fileRequests, FileOperator[] fileOperators, Metadata[] metadatas);
            public static void PullFilesAsync(this IFileClientBase client, int multipleCount, FileRequest[] fileRequests, FileOperator[] fileOperators, Metadata[] metadatas);
            public static void PushFiles(this IFileClientBase client, int multipleCount, FileRequest[] fileRequests, FileOperator[] fileOperators, Metadata[] metadatas);
            public static void PushFilesAsync(this IFileClientBase client, int multipleCount, FileRequest[] fileRequests, FileOperator[] fileOperators, Metadata[] metadatas);
    

    实例代码上传文件
    【服务器】

    static void TestMultiple()
    {
        FileService fileService= CreateFileServicePro();
        fileService.BeforeFileTransfer += (client,e) =>
        {
            string path=Path.Combine(Directory.GetCurrentDirectory(), "Received", e.FileInfo.FileName);
            if (!Directory.Exists(Path.GetDirectoryName(path)))
            {
                Directory.CreateDirectory(Path.GetDirectoryName(path));
            }
            e.FileRequest.SavePath = path;
        };
    }
    
    private static FileService CreateFileServicePro()
    {
        FileService fileService = new FileService();
    
        //声明配置
        var config = new FileServiceConfig();
    
        //继承TcpService配置
        config.ListenIPHosts = new IPHost[] { new IPHost(7789) };//同时监听两个地址
        config.VerifyToken = "FileServer";//连接验证令箭,可实现多租户模式
        fileService.Setup(config);
        fileService.Start();
        Console.WriteLine("启动成功");
        return fileService;
    }
    
    

    【客户端】

    static void TestMultiple()
    {
        FileClient fileClient = CreateFileClientPro();
    
        Console.WriteLine("请输入文件夹路径");
        string[] paths = System.IO.Directory.GetFiles(Console.ReadLine(), "*.*", System.IO.SearchOption.AllDirectories);
        Console.WriteLine($"共搜索到{paths.Length}个文件,按任意键开始传输。");
        Console.ReadKey();
    
        List<FileRequest> requests = new List<FileRequest>();
        List<FileOperator> fileOperators = new List<FileOperator>();
        List<Metadata>  metadatas = new List<Metadata>();
    
        foreach (var item in paths)
        {
            FileRequest fileRequest = new FileRequest()
            {
                Path = item,
                Overwrite = true,
                SavePath = item//此处随便写,服务器会重定向保存路径。
            };
    
            metadatas.Add(null);
            fileOperators.Add(new FileOperator());
            requests.Add(fileRequest);
        }
    
        int num = 0;
        LoopAction loopAction = LoopAction.CreateLoopAction(-1,1000,(loop)=> 
        {
            bool fin = true;
            var ops = fileOperators.ToArray();
            foreach (var item in ops)
            {
                if (item.Result.ResultCode == ResultCode.Default)
                {
                    fin = false;
                }
                else
                {
                    Console.WriteLine($"{++num}号文件传输完成,{item.Result}");
                    fileOperators.Remove(item);
                }
            }
    
            if (fin)
            {
                loop.Dispose();
                Console.WriteLine("传输结束。");
            }
        });
        loopAction.RunAsync();
        fileClient.PushFilesAsync(10,requests.ToArray(),fileOperators.ToArray(),metadatas.ToArray());
        Console.ReadKey();
    }
    
    

    九、其他用法、设置

    9.1 RootPath的设置

    对点的配置文件(或属性)中有个RootPath属性,该属性指示当前对点的根目录,当收到相对路径的请求(或存放)时,会相对于根目录。

    9.2 ResponseType的设置

    连接到服务器后,客户端与服务器可以随意的收、发文件,但是有时候为安全考虑,不允许某客户端Push(推送)文件,所以可以设置服务器响应类型为ResponseType.Pull(亦或者ResponseType.None)。

    9.3 BeforeFileTransfer事件的设置

    BeforeFileTransfer事件是合法远程请求第一个触发的事件,在该事件中,可以获取到发起方传递的所有信息。也可以通过事件参数e.IsPermitOperation来指示,是否同意本次操作。同时也可以通过e.FileOperator获得本次传输的操作器,用于远程显示进度和速度等。

    9.4 FinishedFileTransfer事件的设置

    FinishedFileTransfer事件是结束传输以后触发的,但是这并不意味着完成传输,具体结果还要通过Result属性值进行判断。

    展开全文
  • 那么,异地大文件传输如何更好的得到实现?有没有好的方法解决文件远程传输问题呢? 一般我们认为文件远程传输的关键点在于看双方的上网方式。如果双方都是用同一个ISP的话,可以考虑用QQ传送。举个例子,...

    大文件传输

    大文件远程传输时,一般很多人会选择使用U盘或者移动硬盘在两地进行传递。但万一忘记带移动存储设备了呢?如果选择邮箱、QQ等又需要经历漫长的等待时间,还有可能遇到附件过大小限制、传输中断等问题。

    那么,异地大文件传输如何更好的得到实现?有没有好的方法解决大文件远程传输问题呢?

    一般我们认为大文件远程传输的关键点在于看双方的上网方式。如果双方都是用同一个ISP的话,可以考虑用QQ传送。举个例子,如果双方都是电信的2M的ADSL的话,那么上传一方的最大速度是每秒50kb,也就是说,一方的接收速度只能是每秒50kb,一个小时180MB。

    如果都是同一个ISP的LAN方式上网的话,最大速度可以达到4,5百KB每秒甚至跟高,那一个小时就可以搞定。

    如果不是同一个ISP的话建议就不要试了,那个速度慢的让人难受。或者让一方你刻盘快递寄给你,或者买个2G的U盘,把文件copy过去再快递给对方。

    以上的几种方法,或许是最笨拙最不便捷的方法。如今网盘的流行很便捷的解决了异地大文件传输的难题。

    镭速(Raysync)传输引擎和传统网络资源,为客户提供高速、稳定、安全网络优化服务,大幅节省企业网络资源投入,提高效率,改善网络便捷使用。  

    使用镭速的文件分享功能,您可以不受距离、时间、文件大小甚至网络速度的限制,随时随地的把文件传达到需要的人面前,而所有这些功能的实现,只需要您一次性把文件上传到平台,而其后即便多次修改,版本将自动覆盖,无需再次上传。

    对于外地客户较多以及设立外地分公司或办事处的企业,异地大文件传输的需求频繁,在镭速平台上,您既可以同本公司同事便捷的共享文件,也可以分享链接给外部客户,尽情享受简单工作的便利。

    展开全文
  • 多线程网络传输大都没有实现大于2G文件,在前人基础上改写的真正的多线程网络传输,不受文件大小的限制!先上传大文件上传的完整代码,有需要大文件超过2G的下载,请留言!
  • 怎么把ipad中超大文件传输到电脑

    万次阅读 2020-08-11 20:11:21
    经过实验,结论是可以通过数据线连接传输,电脑要下载软件iTools或iTunes,(注意,若是连接了数据线没反应,可以尝试工具点修复,可能是驱动支持的问题)一切准备就绪,打开iTools后,在找ipad上的文件时,是怎么都...
  • 本篇文章主要介绍了python:socket传输大文件示例,具有一定的参考价值,有兴趣的可以了解一下,
  • 由于业务需要,如今,发送100M以上甚至是GB级大小的文件变得越来越普遍,...下面我们先将几种常用的文件传输方式进行对比分析。 1、邮件:比较常用,方便快捷,但是附件大小有限制,一般是10-30M,即使有超大附件发...
  • 支持断点续大文件传输协议

    千次阅读 2019-06-12 14:10:05
    从1971年A.K.Bhushan提出第一个FTP协议版本(RFC114)到现在,人们对FTP的应用已经历了40余年的时间,同时,许多基于FTP协议的数据传输软件也应运而生。如Windows操作系统下经常使用的支持FTP协议的软件有:CuteFTP...
  • 用MFC实现局域网内点对点的大文件传输、这个程序所采用的是基于TCP/IP协议的Winsock编程原理
  • kafka大文件的代码

    2020-01-03 13:36:01
    kafka的参数配置, 生产者的配置参数设置, 消费者的配置参数设置,read里写了配置参数的说明,
  • windows 之间远程大文件传输问题解决

    千次阅读 2020-08-11 17:20:01
    windows 之间远程大文件传输问题解决
  • 业务场景: 由于工作需要,需要在两台服务器的java服务之间通过netty建立链接,将大文件(几百G到TB级别)从机器A上的serverA发送到机器B上的serverB。 实现方法设计: 系统现有的实现方法:将业务方存储在服务器上...
  • ipad下载document 在document 中将需要的文件复制到 ‘示例文件’,之后点击 ‘电脑’会弹出 ... 最后找到对应文件下载就行了。 总结:同一个wifi下 速度还是很快的,在没有其他好办法的情况的可以使用。 ...
  • udp文件发送
  • http大文件传输

    千次阅读 2019-11-07 14:27:44
    随着科技的发展网络传输的资源越来越,从几k到几M,几G。... 分块传输:因为音频,视频都是经过高倍压缩,在压缩也起不到什么效果,因此有了分块传输,解决大文件传输。 分块传输因名而异,就是将文件...
  • 大文件传输慢,要等好久…… 着断网断电了,还得重新再一次…… 文件太多,出现传输错误、文件丢失的情况…… 要个文件夹,还得压缩打包才能…… 这种种问题,相信很多人在传输文件时,都会遇到的。...
  • webService 大文件传输

    千次阅读 2018-07-14 09:49:28
    pom文件jar包添加: 一般的webservice jar包这里不写了,有两个传输文件需要的jar包:  &lt;dependency&gt;  &lt;groupId&gt;javax.mail&lt;/groupId&gt;  &lt;artifactId&...
  • 采用Visual C++ 6.0开发的一个TCP文件传输系统,采用多线程的传输方式,支持断点续,利用配置文件设置基本的初始化信息。 文件包括源代码和安装包,源代码里包括自定义的文件传输通信协议。 程序采用分层的设计...
  • Socket传输大文件(发送与接收源码):通过Socket服务端与客户端的通信,实现大文件之间传输

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,978,464
精华内容 791,385
关键字:

大文件传输

友情链接: 蓝牙无线遥控.zip