123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- #if COMBAT_SERVER
- using System;
- using System.Buffers;
- using System.Collections.Generic;
- using System.Net;
- using System.Net.Sockets;
- using System.Net.Sockets.Kcp;
- using System.Threading;
- using Com.Fort23.Protocol.Protobuf;
- using Fort23.UTool;
- namespace Core.KCPTool
- {
- public class KCPServerConnection : IKcpCallback, IServerConnection
- {
- // private Thread _udpClientThread;
- private byte[] buffer = new byte[2048];
- private KCPServer kcpServer;
- // public Queue<CombatSynchronizeRequest> CombatSynchronizeRequests { get; set; }
- public bool isConnected { get; set; }
- public int connectionID { get; set; }
- public long playerId { get; set; }
- private long lasetSendTime;
- public KCPServerConnection(KCPServer kcpServer, IPEndPoint endPoint)
- {
- EndPoint = endPoint;
- this.kcpServer = kcpServer;
- _kcp = new SimpleSegManager.Kcp(0, this);
- kcp.NoDelay(1, 40, 2, 0);
- isConnected = true;
- }
- public SimpleSegManager.Kcp kcp
- {
- get { return _kcp; }
- }
- public IPEndPoint EndPoint { get; set; }
- private SimpleSegManager.Kcp _kcp;
- public void Output(IMemoryOwner<byte> buffer, int avalidLength)
- {
- if (EndPoint == null || kcpServer == null)
- {
- LogTool.Log("发送错误,链接没有了:");
- return;
- }
- var s = buffer.Memory.Span.Slice(0, avalidLength).ToArray();
- // LogTool.Log("发送:" + EndPoint.Address + "__" + EndPoint.Port);
- kcpServer.SocketSendTo(s, EndPoint);
- buffer.Dispose();
- }
- public int SendData(byte[] data, int dataSize)
- {
- if (_kcp == null)
- {
- return -255;
- }
- int c = kcp.Send(data.AsSpan().Slice(0, dataSize));
- return c;
- }
- public void Update()
- {
- if (_kcp == null)
- {
- return;
- }
- kcp.Update(DateTimeOffset.UtcNow);
- }
- public void ReceiveAsync()
- {
- if (kcp == null)
- {
- return;
- }
- var (buffer, avalidLength) = kcp.TryRecv();
- if (avalidLength <= 0)
- {
- return;
- }
- var s = buffer.Memory.Span.Slice(0, avalidLength).ToArray();
- if (s == null)
- {
- return;
- }
- SendDataType sendDataType = (SendDataType)s[0];
- switch (sendDataType)
- {
- // case SendDataType.ShakeHands:
- // byte[] playerData = new byte[8];
- // playerData[0] = s[1];
- // playerData[1] = s[2];
- // playerData[2] = s[3];
- // playerData[3] = s[4];
- // playerData[4] = s[5];
- // playerData[5] = s[6];
- // playerData[6] = s[7];
- // playerData[7] = s[8];
- // long playerId = SocketTool.ByteToInt(playerData);
- // this.playerId = playerId;
- // LogTool.Log("收到握手包"+playerId);
- // kcpServer.AddServerConnection(playerId,0, this);
- //
- // break;
- case SendDataType.Data:
- byte[] protoBuffer = new byte[s.Length - 1];
- Array.Copy(s, 1, protoBuffer, 0, protoBuffer.Length);
- CombatSynchronizeRequest combatSynchronizeRequest =
- CombatSynchronizeRequest.Parser.ParseFrom(protoBuffer);
- if (combatSynchronizeRequest == null)
- {
- LogTool.Error("错误的实例化战斗" + s.Length);
- }
- else
- {
- // LogTool.Error("收到客户端消息" + combatSynchronizeRequest.CombatSynchronizeType);
- kcpServer.AddCombatSynchronizeRequest(combatSynchronizeRequest);
- }
- break;
- case SendDataType.GetGameFrameByte:
- int gameFrame = 0;
- byte[] fdata = new byte[4];
- Array.Copy(s, 9, fdata, 0, fdata.Length);
- gameFrame = SocketTool.ByteToInt(fdata);
- kcpServer.SendGameFrame(gameFrame, this);
- break;
- }
- }
- public int Input(byte[] data)
- {
- int ok = kcp.Input(data);
- return ok;
- }
- public void Dispose()
- {
- // _udpClientThread = null;
- kcp?.Dispose();
- _kcp = null;
- kcpServer = null;
- }
- }
- }
- #endif
|