KCPServerConnection.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #if COMBAT_SERVER
  2. using System;
  3. using System.Buffers;
  4. using System.Collections.Generic;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.Net.Sockets.Kcp;
  8. using System.Threading;
  9. using Com.Fort23.Protocol.Protobuf;
  10. using Fort23.UTool;
  11. namespace Core.KCPTool
  12. {
  13. public class KCPServerConnection : IKcpCallback, IServerConnection
  14. {
  15. // private Thread _udpClientThread;
  16. private byte[] buffer = new byte[2048];
  17. private KCPServer kcpServer;
  18. // public Queue<CombatSynchronizeRequest> CombatSynchronizeRequests { get; set; }
  19. public bool isConnected { get; set; }
  20. public int connectionID { get; set; }
  21. public long playerId { get; set; }
  22. private long lasetSendTime;
  23. public KCPServerConnection(KCPServer kcpServer, IPEndPoint endPoint)
  24. {
  25. EndPoint = endPoint;
  26. this.kcpServer = kcpServer;
  27. _kcp = new SimpleSegManager.Kcp(0, this);
  28. kcp.NoDelay(1, 40, 2, 0);
  29. isConnected = true;
  30. }
  31. public SimpleSegManager.Kcp kcp
  32. {
  33. get { return _kcp; }
  34. }
  35. public IPEndPoint EndPoint { get; set; }
  36. private SimpleSegManager.Kcp _kcp;
  37. public void Output(IMemoryOwner<byte> buffer, int avalidLength)
  38. {
  39. if (EndPoint == null || kcpServer == null)
  40. {
  41. LogTool.Log("发送错误,链接没有了:");
  42. return;
  43. }
  44. var s = buffer.Memory.Span.Slice(0, avalidLength).ToArray();
  45. // LogTool.Log("发送:" + EndPoint.Address + "__" + EndPoint.Port);
  46. kcpServer.SocketSendTo(s, EndPoint);
  47. buffer.Dispose();
  48. }
  49. public int SendData(byte[] data, int dataSize)
  50. {
  51. if (_kcp == null)
  52. {
  53. return -255;
  54. }
  55. int c = kcp.Send(data.AsSpan().Slice(0, dataSize));
  56. return c;
  57. }
  58. public void Update()
  59. {
  60. if (_kcp == null)
  61. {
  62. return;
  63. }
  64. kcp.Update(DateTimeOffset.UtcNow);
  65. }
  66. public void ReceiveAsync()
  67. {
  68. if (kcp == null)
  69. {
  70. return;
  71. }
  72. var (buffer, avalidLength) = kcp.TryRecv();
  73. if (avalidLength <= 0)
  74. {
  75. return;
  76. }
  77. var s = buffer.Memory.Span.Slice(0, avalidLength).ToArray();
  78. if (s == null)
  79. {
  80. return;
  81. }
  82. SendDataType sendDataType = (SendDataType)s[0];
  83. switch (sendDataType)
  84. {
  85. // case SendDataType.ShakeHands:
  86. // byte[] playerData = new byte[8];
  87. // playerData[0] = s[1];
  88. // playerData[1] = s[2];
  89. // playerData[2] = s[3];
  90. // playerData[3] = s[4];
  91. // playerData[4] = s[5];
  92. // playerData[5] = s[6];
  93. // playerData[6] = s[7];
  94. // playerData[7] = s[8];
  95. // long playerId = SocketTool.ByteToInt(playerData);
  96. // this.playerId = playerId;
  97. // LogTool.Log("收到握手包"+playerId);
  98. // kcpServer.AddServerConnection(playerId,0, this);
  99. //
  100. // break;
  101. case SendDataType.Data:
  102. byte[] protoBuffer = new byte[s.Length - 1];
  103. Array.Copy(s, 1, protoBuffer, 0, protoBuffer.Length);
  104. CombatSynchronizeRequest combatSynchronizeRequest =
  105. CombatSynchronizeRequest.Parser.ParseFrom(protoBuffer);
  106. if (combatSynchronizeRequest == null)
  107. {
  108. LogTool.Error("错误的实例化战斗" + s.Length);
  109. }
  110. else
  111. {
  112. // LogTool.Error("收到客户端消息" + combatSynchronizeRequest.CombatSynchronizeType);
  113. kcpServer.AddCombatSynchronizeRequest(combatSynchronizeRequest);
  114. }
  115. break;
  116. case SendDataType.GetGameFrameByte:
  117. int gameFrame = 0;
  118. byte[] fdata = new byte[4];
  119. Array.Copy(s, 9, fdata, 0, fdata.Length);
  120. gameFrame = SocketTool.ByteToInt(fdata);
  121. kcpServer.SendGameFrame(gameFrame, this);
  122. break;
  123. }
  124. }
  125. public int Input(byte[] data)
  126. {
  127. int ok = kcp.Input(data);
  128. return ok;
  129. }
  130. public void Dispose()
  131. {
  132. // _udpClientThread = null;
  133. kcp?.Dispose();
  134. _kcp = null;
  135. kcpServer = null;
  136. }
  137. }
  138. }
  139. #endif