说明
Stream的直接发送,单个TCP连接上可以同时进行多个传输。客户端与服务器之间可以任意相互发送。
特性
- 实时检测速度,进度等信息。
- 从Stream.Position开始,直到Read结束。
- 传输限速(限企业版,开源版为全速模式)
示例
下列以服务器作为Stream的接收方。客户端为发送方。
【服务器】
TcpTouceRpcService service = CreateTcpTouceRpcService();service.StreamTransfering += (socketClient, e) =>{e.Bucket = new MemoryStream();//此处用MemoryStream作为接收容器,也可以使用FileStream。e.AddOperation(Operation.Permit);//允许接收该流Metadata metadata = e.Metadata;//获取元数据StreamOperator streamOperator = e.StreamOperator;//获取操作器,可用于取消任务,获取进度等。//Console.WriteLine("设置最大传输速度为1024byte");//streamOperator.SetMaxSpeed(1024);//Console.WriteLine("5秒后设置为5Mb");//RRQMCore.Run.EasyAction.DelayRun(5, () =>//{// streamOperator.SetMaxSpeed(1024 * 1024 * 5);//});Task.Run(async () =>{while (streamOperator.Result.ResultCode == ResultCode.Default){Console.WriteLine($"速度={streamOperator.Speed()},进度={streamOperator.Progress}");await Task.Delay(1000);}Console.WriteLine($"从循环传输结束,状态={streamOperator.Result}");});Console.WriteLine("开始接收流数据");};service.StreamTransfered += (socketClient, e) =>{//此处不管传输成功与否,都会执行,具体状态通过e.Status判断。if (e.Result.ResultCode == ResultCode.Success){}e.Bucket.Dispose();//必须手动释放流数据。Console.WriteLine($"从ReceivedStream传输结束,状态={e.Result}");};
【客户端】
TcpTouchRpcClient client = CreateTcpTouchRpcClient();byte[] data = new byte[1024 * 1024 * 50];new Random().NextBytes(data);MemoryStream stream = new MemoryStream(data);stream.Position = 0;Console.WriteLine($"即将发送流数据,长度为:{stream.Length}");StreamOperator streamOperator = new StreamOperator();streamOperator.PackageSize = 1024 * 64;//分包长度//streamOperator.SetMaxSpeed(1024 * 1024 * 5);//最大传输值//streamOperator.Cancel();//随时取消传输LoopAction loopAction = LoopAction.CreateLoopAction(-1, 1000, (a) =>{if (streamOperator.Result.ResultCode != ResultCode.Default){a.Dispose();}Console.WriteLine($"速度:{streamOperator.Speed()},进度:{streamOperator.Progress}");});loopAction.RunAsync();Metadata metadata = new Metadata();//将键值对的元数据传到接收端metadata.Add("1", "1");metadata.Add("2", "2");//该方法会阻塞,直到结束Result result = client.SendStream(stream, streamOperator, metadata);Console.WriteLine(result);
