说明

Stream的直接发送,单个TCP连接上可以同时进行多个传输。客户端与服务器之间可以任意相互发送。

特性

  1. 实时检测速度,进度等信息。
  2. 从Stream.Position开始,直到Read结束。
  3. 传输限速(限企业版,开源版为全速模式)

示例

下列以服务器作为Stream的接收方。客户端为发送方。

【服务器】

  1. TcpTouceRpcService service = CreateTcpTouceRpcService();
  2. service.StreamTransfering += (socketClient, e) =>
  3. {
  4. e.Bucket = new MemoryStream();//此处用MemoryStream作为接收容器,也可以使用FileStream。
  5. e.AddOperation(Operation.Permit);//允许接收该流
  6. Metadata metadata = e.Metadata;//获取元数据
  7. StreamOperator streamOperator = e.StreamOperator;//获取操作器,可用于取消任务,获取进度等。
  8. //Console.WriteLine("设置最大传输速度为1024byte");
  9. //streamOperator.SetMaxSpeed(1024);
  10. //Console.WriteLine("5秒后设置为5Mb");
  11. //RRQMCore.Run.EasyAction.DelayRun(5, () =>
  12. //{
  13. // streamOperator.SetMaxSpeed(1024 * 1024 * 5);
  14. //});
  15. Task.Run(async () =>
  16. {
  17. while (streamOperator.Result.ResultCode == ResultCode.Default)
  18. {
  19. Console.WriteLine($"速度={streamOperator.Speed()},进度={streamOperator.Progress}");
  20. await Task.Delay(1000);
  21. }
  22. Console.WriteLine($"从循环传输结束,状态={streamOperator.Result}");
  23. });
  24. Console.WriteLine("开始接收流数据");
  25. };
  26. service.StreamTransfered += (socketClient, e) =>
  27. {
  28. //此处不管传输成功与否,都会执行,具体状态通过e.Status判断。
  29. if (e.Result.ResultCode == ResultCode.Success)
  30. {
  31. }
  32. e.Bucket.Dispose();//必须手动释放流数据。
  33. Console.WriteLine($"从ReceivedStream传输结束,状态={e.Result}");
  34. };

【客户端】

  1. TcpTouchRpcClient client = CreateTcpTouchRpcClient();
  2. byte[] data = new byte[1024 * 1024 * 50];
  3. new Random().NextBytes(data);
  4. MemoryStream stream = new MemoryStream(data);
  5. stream.Position = 0;
  6. Console.WriteLine($"即将发送流数据,长度为:{stream.Length}");
  7. StreamOperator streamOperator = new StreamOperator();
  8. streamOperator.PackageSize = 1024 * 64;//分包长度
  9. //streamOperator.SetMaxSpeed(1024 * 1024 * 5);//最大传输值
  10. //streamOperator.Cancel();//随时取消传输
  11. LoopAction loopAction = LoopAction.CreateLoopAction(-1, 1000, (a) =>
  12. {
  13. if (streamOperator.Result.ResultCode != ResultCode.Default)
  14. {
  15. a.Dispose();
  16. }
  17. Console.WriteLine($"速度:{streamOperator.Speed()},进度:{streamOperator.Progress}");
  18. });
  19. loopAction.RunAsync();
  20. Metadata metadata = new Metadata();//将键值对的元数据传到接收端
  21. metadata.Add("1", "1");
  22. metadata.Add("2", "2");
  23. //该方法会阻塞,直到结束
  24. Result result = client.SendStream(stream, streamOperator, metadata);
  25. Console.WriteLine(result);