123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- using System;
- using System.Net;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using Chat;
- /// <summary>
- /// 聊天服务
- /// </summary>
- class ChatServer : MonoSingleton<ChatServer>
- {
- public enum State
- {
- /// <summary>
- /// 未初始化, 需要初始化
- /// </summary>
- UnInited = 0,
- /// <summary>
- /// 已初始化, 需要登录
- /// </summary>
- Inited = 1,
- /// <summary>
- /// 已登录, 可以上报伤害以及自己的剩余血量
- /// </summary>
- Logined = 2,
- /// <summary>
- /// 离开房间, 不可以继续上报伤害和剩余血量
- /// </summary>
- Leaved = 3
- }
- TasPBSocketManager socket;
- readonly Queue<SC_ChatNewMsg> _netMessageDataQueue = new Queue<SC_ChatNewMsg>();
- /// <summary>
- /// 当前状态
- /// </summary>
- public State CurrentState { get; private set; }
- /// <summary>
- /// 先初始化
- /// </summary>
- public void Init()
- {
- var ip = "192.168.10.17";
- if (GlobalConfig.netType == eNetType.Online || GlobalConfig.netType == eNetType.TestOnline)
- {
- var uri = "ylsjtt.game7000.com";
- IPHostEntry entry = Dns.GetHostEntry(uri);
- if (entry != null && entry.AddressList != null && entry.AddressList.Length > 0)
- {
- IPAddress addr = entry.AddressList[0]; //使用时使用AddressList[0]即可
- ip = addr.ToString();
- }
- }
-
- socket = new TasPBSocketManager();
- socket.Connect(ip, GlobalConfig.CharServerPort);
- // 挂载 服务端消息回调处理函数
- MessageCenter.Instance.addObsever(eProtocalCommand.ScChatNewMsg, On_NewMessage);
- MessageCenter.Instance.addObsever(eProtocalCommand.ScChatLogin, On_LoginOver);
- this.CurrentState = State.Inited;
- var p = UserProxy.Instance.player;
- if (null != p)
- {
- this.Login(p.uid, p.baseInfo.name, p.zoneid);
- }
- else
- {
- LogHelper.LogError("此时玩家尚未完成登录, 无法取得玩家信息, 聊天登录时无个人信息可供初始化!");
- }
- //DontDestroyOnLoad(this.gameObject);
- }
- #region 向服务端发送消息
- /// <summary>
- /// 进入房间后发送第一条消息
- /// </summary>
- /// <param name="uid"></param>
- /// <param name="zoneid"></param>
- void Login(string uid, string name, int zoneid)
- {
- UnityEngine.Debug.Assert(CurrentState == State.Inited, $"当前状态不可以执行login,({CurrentState})");
- if (CurrentState == State.Inited)
- {
- var msg = new CS_ChatLogin() { Uid = uid, Name = name, Zoneid = zoneid };
- socket.SendMsg(eProtocalCommand.CsChatLogin, msg);
- LogHelper.Log("Chat模块发送登录请求");
- }
- }
- /// <summary>
- /// 上报伤害
- /// </summary>
- /// <param name="damage"></param>
- public void SendMessage(ChatChannel channl, string message)
- {
- UnityEngine.Debug.Assert(CurrentState == State.Logined, $"当前状态不可以执行发送消息,({CurrentState})");
- if (CurrentState == State.Logined)
- {
- var msg = new CS_ChatSendMsg() { ToChannel = channl, Msg = message };
- socket.SendMsg(eProtocalCommand.CsChatSendMsg, msg);
- }
- }
- public void SendPrivateMessage(string toNickName, string message)
- {
- UnityEngine.Debug.Assert(CurrentState == State.Logined, $"当前状态不可以执行发送消息,({CurrentState})");
- if (CurrentState == State.Logined)
- {
- var msg = new CS_ChatSendMsg() { ToChannel = ChatChannel.Single, ToNickName = toNickName, Msg = message };
- socket.SendMsg(eProtocalCommand.CsChatSendMsg, msg);
- }
- }
- /// <summary>
- /// 尝试获取信消息
- /// </summary>
- /// <param name="msg"></param>
- /// <returns></returns>
- public bool TryReadMessage(out SC_ChatNewMsg msg)
- {
- if (_netMessageDataQueue.Count > 0)
- {
- msg = _netMessageDataQueue.Dequeue();
- return true;
- }
- msg = null;
- return false;
- }
- #endregion
- #region 服务端消息回调
- /// <summary>
- /// 错误信息
- /// </summary>
- /// <param name="errCode"></param>
- /// <returns></returns>
- static string _loginErrInfo(SC_ChatLogin.Types.ErrorCode errCode)
- {
- switch (errCode)
- {
- case SC_ChatLogin.Types.ErrorCode.AccIdinvalid:
- return "uid非法";
- case SC_ChatLogin.Types.ErrorCode.LoginRepeat:
- return "重复登录";
- case SC_ChatLogin.Types.ErrorCode.InnerError:
- return "内部错误";
- default:
- return "未知错误!";
- }
- }
- void On_LoginOver(byte[] _data)
- {
- var msg = SC_ChatLogin.Parser.ParseFrom(_data);
- if (msg != null)
- {
- if (msg.Code == SC_ChatLogin.Types.ErrorCode.Ok)
- {
- CurrentState = State.Logined;
- LogHelper.Log("聊天服务器登录成功");
- }
- else
- {
- LogHelper.Log("聊天模块登录失败" + _loginErrInfo(msg.Code));
- }
- }
- else
- {
- LogHelper.Log("聊天模块登录返回消息解析失败!");
- }
- }
- /// <summary>
- /// 信道名称
- /// </summary>
- /// <param name="c"></param>
- /// <returns></returns>
- static string ChannelName(ChatChannel c)
- {
- switch (c)
- {
- case ChatChannel.System:
- return "系统";
- case ChatChannel.World:
- return "世界";
- case ChatChannel.Guild:
- return "公会";
- default:
- return "x";
- }
- }
- void On_NewMessage(byte[] _data)
- {
- var msg = SC_ChatNewMsg.Parser.ParseFrom(_data);
- LogHelper.Log($"[{ChannelName(msg.FromChannel)}]-[{msg.SenderName}] : " + msg.Msg);
- // todo : 转接客户端逻辑
- _netMessageDataQueue.Enqueue(msg);
- }
- #endregion
- #region ' 其他辅助函数 '
- void _close()
- {
- MessageCenter.Instance.removeObserver(eProtocalCommand.ScChatNewMsg, On_NewMessage);
- MessageCenter.Instance.removeObserver(eProtocalCommand.ScChatLogin, On_LoginOver);
- if (null != socket)
- {
- LogHelper.Log("聊天模块销毁socket");
- socket.Close();
- socket = null;
- }
- }
- public void Update()
- {
- if (null != socket)
- {
- socket.Update();
- }
- }
- private void OnDisable()
- {
- _close();
- }
- protected override void DoOnDestroy()
- {
- _close();
- }
- #endregion
- }
|