UChannel.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. namespace Base
  6. {
  7. internal class UChannel: AChannel
  8. {
  9. private readonly USocket socket;
  10. public string RemoteAddress { get; private set; }
  11. private TaskCompletionSource<byte[]> recvTcs;
  12. /// <summary>
  13. /// connect
  14. /// </summary>
  15. public UChannel(USocket socket, string host, int port, UService service): base(service)
  16. {
  17. this.socket = socket;
  18. this.service = service;
  19. this.RemoteAddress = host + ":" + port;
  20. this.socket.ConnectAsync(host, (ushort)port);
  21. this.socket.Received += this.OnRecv;
  22. }
  23. /// <summary>
  24. /// accept
  25. /// </summary>
  26. public UChannel(USocket socket, UService service) : base(service)
  27. {
  28. this.socket = socket;
  29. this.service = service;
  30. this.RemoteAddress = socket.RemoteAddress;
  31. this.socket.Received += this.OnRecv;
  32. }
  33. public override void Dispose()
  34. {
  35. if (this.Id == 0)
  36. {
  37. return;
  38. }
  39. base.Dispose();
  40. this.socket.Dispose();
  41. }
  42. public override void Send(byte[] buffer, byte channelID = 0, PacketFlags flags = PacketFlags.Reliable)
  43. {
  44. this.socket.SendAsync(buffer, channelID, flags);
  45. }
  46. public override void Send(List<byte[]> buffers, byte channelID = 0, PacketFlags flags = PacketFlags.Reliable)
  47. {
  48. int size = buffers.Select(b => b.Length).Sum();
  49. var buffer = new byte[size];
  50. int index = 0;
  51. foreach (byte[] bytes in buffers)
  52. {
  53. Array.Copy(bytes, 0, buffer, index, bytes.Length);
  54. index += bytes.Length;
  55. }
  56. this.socket.SendAsync(buffer, channelID, flags);
  57. }
  58. public override Task<byte[]> Recv()
  59. {
  60. TaskCompletionSource<byte[]> tcs = new TaskCompletionSource<byte[]>();
  61. var recvQueue = this.socket.RecvQueue;
  62. if (recvQueue.Count > 0)
  63. {
  64. tcs.SetResult(recvQueue.Dequeue());
  65. }
  66. else
  67. {
  68. recvTcs = tcs;
  69. }
  70. return tcs.Task;
  71. }
  72. private void OnRecv()
  73. {
  74. this.recvTcs?.SetResult(this.socket.RecvQueue.Dequeue());
  75. this.recvTcs = null;
  76. }
  77. }
  78. }