using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using UnityEngine; namespace GeneralTools { public class SocketBase { protected string socketName = ""; protected static int socketCount = 0; protected bool socketClose = false; protected Queue receiveMsgQueue = new Queue(); protected char separator; protected DebugMsgMode debugMsgMode; protected Encoding encoding; protected int reveiceByteSize; protected float reConnectedTime = 0; protected float nowTime = 0; protected event Action receiveStringListeners; protected event Action receiveByteListeners; protected event Action receiveMsgListeners; public event Action onSocketQuit; public SocketBase() { encoding = Encoding.UTF8; reveiceByteSize = 1024; //默认按照#分割收到消息 separator = '#'; //给一个默认的名字 socketCount += 1; socketName = "Socket_" + socketCount; receiveMsgListeners += DefultDebugMsg; } //设置参数 public virtual SocketBase SetSocketName(string _socketName) { socketName = _socketName; return this; } public string GetSocketName() { return socketName; } /// /// 设置编码格式 /// /// /// public virtual SocketBase SetMsgEncoding(Encoding _encoding) { encoding = _encoding; //设置完成后清除消息 ClearAllQueue(); return this; } /// /// 设置分割符,值为char.MinValue时不分割 /// /// /// public virtual SocketBase SetSeparator(char _separator) { separator = _separator; //设置完成后清除消息 ClearAllQueue(); return this; } /// /// 设置Debug消息模式 /// /// /// public virtual SocketBase SetDebugMsgMode(DebugMsgMode mode) { debugMsgMode = mode; return this; } public SocketBase SetReconnectedTime(float time) { reConnectedTime = time; return this; } public SocketBase SetNowTime(float _nowTime) { nowTime = _nowTime; return this; } public SocketBase SetReceiveByteSize(int size) { reveiceByteSize = size; return this; } /// /// 添加接收消息事件 /// /// public SocketBase AddReceiveEvent(Action receiveAction) { if (receiveAction != null) receiveStringListeners += receiveAction; return this; } public SocketBase AddReceiveEvent(Action receiveAction) { if (receiveAction != null) receiveByteListeners += receiveAction; return this; } public SocketBase AddReceiveEvent(Action receiveAction) { if (receiveAction != null) receiveMsgListeners += receiveAction; return this; } /// /// 移除接收消息事件 /// /// public SocketBase RemoveReceiveEvent(Action receiveAction) { if (receiveAction != null) receiveStringListeners -= receiveAction; return this; } public SocketBase RemoveReceiveEvent(Action receiveAction) { if (receiveAction != null) receiveByteListeners -= receiveAction; return this; } public SocketBase RemoveReceiveEvent(Action receiveAction) { if (receiveAction != null) receiveMsgListeners -= receiveAction; return this; } //移除所有事件 public SocketBase RemoveAllReceiveEvent() { receiveMsgListeners = null; receiveByteListeners = null; receiveStringListeners = null; return this; } //获得接收到的消息 protected virtual List GetReceiveMsg(int count = -1) { int getCount = 0; List temp = new List(); lock (receiveMsgQueue) { while (receiveMsgQueue.Count > 0) { SocketMsg newMsg = receiveMsgQueue.Dequeue(); if (newMsg == null) continue; temp.Add(newMsg); getCount++; if (getCount == count) break; } } return temp; } public void DoReceiveEvent() { List msg = GetReceiveMsg(); foreach (var item in msg) { if (receiveMsgListeners != null) { receiveMsgListeners(item); } if (receiveStringListeners != null) { string receiveMsg = item.msg; string[] msgArr = receiveMsg.Split(separator); for (int i = 0; i < msgArr.Length; i++) { if (!string.IsNullOrEmpty(msgArr[i])) receiveStringListeners(msgArr[i]); } } if (receiveByteListeners != null) { receiveByteListeners(item.bytes); } } } /// /// 添加接收消息事件 /// /// protected void DefultDebugMsg(SocketMsg msg) { if (ConfigHelper.debugSocketMsgMode == 0) return; if (debugMsgMode == DebugMsgMode.none) return; string debugStr = ""; if (debugMsgMode == DebugMsgMode.stringMsg) { debugStr = msg.msg; } else if (debugMsgMode == DebugMsgMode.byteMsgDec) { foreach (var b in msg.bytes) { debugStr += b.ToString() + " "; } } else if (debugMsgMode == DebugMsgMode.byteMsgHex) { foreach (var b in msg.bytes) { debugStr += b.ToString("X2") + " "; } } if (ConfigHelper.debugSocketMsgMode == 1) { Debug.Log("Receive:" + debugStr); } else if (ConfigHelper.debugSocketMsgMode == 2) { Debug.Log("Receive:" + msg.createTime.ToString("F2") + ":" + msg.socketName + ":" + msg.remoteIpEndPoint + ":" + debugStr); } } protected void ClearAllQueue() { receiveMsgQueue.Clear(); } public virtual void SocketQuit() { socketClose = true; onSocketQuit?.Invoke(); } protected static string Bytes2String(byte[] bytes, Encoding _encoding) { if (_encoding == null) _encoding = Encoding.UTF8; return _encoding.GetString(bytes); } protected static byte[] String2Bytes(string str, Encoding _encoding) { if (_encoding == null) _encoding = Encoding.UTF8; return _encoding.GetBytes(str); } protected virtual void RecordReceiveMsg(byte[] receiveByte, int length, EndPoint _localEndPoint, EndPoint _remoteEndPoint) { byte[] newByte = receiveByte.Skip(0).Take(length).ToArray(); SocketMsg newMsg = new SocketMsg(); newMsg.createTime = nowTime; newMsg.localIpEndPoint = (IPEndPoint)_localEndPoint; newMsg.remoteIpEndPoint = (IPEndPoint)_remoteEndPoint; newMsg.socketName = socketName; newMsg.bytes = newByte; newMsg.msg = Bytes2String(newByte, encoding); lock (receiveMsgQueue) { receiveMsgQueue.Enqueue(newMsg); } } //发送消息 public virtual void SendMsg(string strMsg) { } public virtual void SendMsg(byte[] byteMsg) { } public virtual void SendMsg(IPEndPoint remote, string strMsg) { } public virtual void SendMsg(IPEndPoint remote, byte[] byteMsg) { } } public class SocketMsg { public float createTime; public string socketName; public IPEndPoint localIpEndPoint; public IPEndPoint remoteIpEndPoint; public Encoding encoding; public byte[] bytes; public string msg; public SocketMsg() { localIpEndPoint = new IPEndPoint(IPAddress.Any, 0); remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); socketName = ""; encoding = Encoding.UTF8; bytes = new byte[0]; } } public enum DebugMsgMode { stringMsg = 0, byteMsgDec = 1, byteMsgHex = 2, none = 99, } }