using System; using System.Collections.Concurrent; using System.Text; using System.Threading; using GameMessage; using MessagePack; using MrWu; using MrWu.Debug; using Server.Core; using Server.Core.Extend; namespace Server.Net { /// /// 会话 /// public class Session : IUserSession { /// /// 唯一id /// public long Id { get; private set; } public long InstanceId { get { return Id; } } public BaseWChannel WChannel { get; private set; } /// /// 读写时间 /// public long ReadWriteTime; /// /// 登录验证码 /// public string VerificationCode { get; set; } /// /// 是否已经断开连接 /// public bool IsDisConnected { get; private set; } /// /// 绑定的用户数据 -- 老的用户数据 /// public SessionUserData UserData { get; private set; } /// /// 断线锁 /// public readonly object DisConnectLock = new object(); public string RemoteIPAddress { get { return WChannel.RemoteEndPointIP; } } public Session(BaseWChannel wChannel) { this.WChannel = wChannel; Id = NetServices.CreateAcceptChannelId(); } public virtual void Send(MessageData messageData) { if (messageData == null) { Debug.Error("不能发送空数据!"); return; } byte[] data = PacketUtility.MessageParseData(messageData); Send(data); } public void Send(byte[] data,Type messageType) { data = PacketUtility.MessageParseData(messageType, data); Send(data); } /// /// 发送数据 /// /// public virtual void Send(byte[] data) { if (IsDisConnected) { Debug.Info("发送失败,链接已经断开!"); return; } if (!WChannel.Active) { Debug.Info("链接已经断开,发送失败!"); return; } Interlocked.Exchange(ref ReadWriteTime, TimeInfo.Instance.FrameTime); // 组件 data 数据 // 分类发送 WChannel.Send(data); } public virtual void Send(string message) { if (IsDisConnected) { Debug.Info("发送失败,链接已经断开!"); return; } if (!WChannel.Active) { Debug.Info("链接已经断开,发送失败!"); return; } Interlocked.Exchange(ref ReadWriteTime, TimeInfo.Instance.FrameTime); WChannel.Send(message); } public void DisConnected() { WChannel.BeginDisconnect(); } /// /// 绑定用户 /// public void BindUser(int userid, string uuid, int clientVer, int plat, string deviceInfo, bool isNewUser,string storeType, bool reset = false) { if (IsDisConnected) { return; } if (!reset && UserData != null) { Debug.Error("该会话已经绑定了用户数据!"); return; } ClearUserData(); UserData = SessionUserData.Create(userid, uuid, clientVer, plat, deviceInfo,isNewUser, storeType); SessionUUIDManager.Instance.AddSessionUUID(uuid, UserData); GameNetDispatcher.Instance.Dispatch(GameNetMsgId.SessionBindUser, this); } public void ClearUserData() { if (UserData != null) { GameNetDispatcher.Instance.Dispatch(GameNetMsgId.SessionUnBindUser, this); SessionUUIDManager.Instance.RemoveLocalUUID(UserData.Uuid, UserData); UserData = null; } } /// /// 断开连接事件 /// public virtual void OnDisConnected() { if (IsDisConnected) { return; } IsDisConnected = true; GameNetDispatcher.Instance.DispatchNextFrame(GameNetMsgId.SessionDisConnected, this); ClearUserData(); Clear(); } public virtual void Clear() { } } }