using SuperSocket.ClientEngine; using System; using System.Net; namespace ET.Server { [FriendOf(typeof(FastStreamComponent))] public static class FastStreamComponentSystem { public class FastStreamComponentAwakeSystem: AwakeSystem { protected override void Awake(FastStreamComponent self) { FastStreamComponent.Instance = self; self.FastStreamClient = new EasyClient(); self.FastStreamClient.Initialize(new FastStreamMessageDecoder(FastStreamMessageDecoder.LEN_HEAD), OnSessionDataReceived); self.FastStreamClient.NoDelay = true; self.FastStreamClient.ReceiveBufferSize = 10 * 1024 * 1024; self.FastStreamClient.Connected += new EventHandler(OnSessionConnected); self.FastStreamClient.Error += new EventHandler(OnSessionError); self.FastStreamClient.Closed += new EventHandler(OnSessionClosed); //IPAddress ipAddress = Dns.GetHostAddresses("localhost")[0]; IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3370); // IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("47.98.144.16"), 3370); self.FastStreamClient.ConnectAsync(endpoint); } } public class FastStreamComponentDestroySystem: DestroySystem { protected override void Destroy(FastStreamComponent self) { Log.Info($"Ice component destroyed"); self.FastStreamClient?.Close(); self.FastStreamClient = null; } } //===component扩展============= public static void SendData(this FastStreamComponent self, string key, byte[] value) { ByteBuffer buff = ByteBuffer.Allocate(2048, true); buff.WriteShort((short)key.Length); buff.WriteInt(value.Length); buff.WriteBytes(key.ToUtf8()); buff.WriteBytes(value); self.FastStreamClient.Send(new ArraySegment(buff.GetBuffer(), 0, buff.ReadableBytes)); } //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ private static void OnSessionConnected(object sender, EventArgs e) { Log.Debug("fast stream session connected"); FastStreamComponent.Instance.SendData("connetorId", ("bs-" + ConstGame.GameServerId.ToString()).ToUtf8()); } private static void OnSessionDataReceived(FastStreamBuffer pack) { long usrid = (long)pack.Key; byte[] data = pack.Data; //Log.Debug($"receive fast stream data, uid({usrid}), msglen:{data.Length}"); //找到此unit对应的Player(id相同) WNPlayer player = FastStreamComponent.Instance.DomainScene().GetComponent().Get(usrid); if (player != null) { MessageHelper.SendToClient(player, new BattleEventPush() { key = (ushort)BattlePushCnst.FastStreamPush, data = data}); } // else // { // Log.Error($"Not found player({usrid}) @faststream data"); // } } private static void OnSessionError(object sender, ErrorEventArgs e) { Log.Error("fast stream session error"); } private static void OnSessionClosed(object sender, EventArgs e) { Log.Warning("fast stream session closed"); } } }