DCS/ruiyiweiUX/Assets/GeneralTools/Scripts/Socket/SocketBase.cs

313 lines
9.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<SocketMsg> receiveMsgQueue = new Queue<SocketMsg>();
protected char separator;
protected DebugMsgMode debugMsgMode;
protected Encoding encoding;
protected int reveiceByteSize;
protected float reConnectedTime = 0;
protected float nowTime = 0;
protected event Action<string> receiveStringListeners;
protected event Action<byte[]> receiveByteListeners;
protected event Action<SocketMsg> 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;
}
/// <summary>
/// 设置编码格式
/// </summary>
/// <param name="_encoding"></param>
/// <returns></returns>
public virtual SocketBase SetMsgEncoding(Encoding _encoding)
{
encoding = _encoding;
//设置完成后清除消息
ClearAllQueue();
return this;
}
/// <summary>
/// 设置分割符值为char.MinValue时不分割
/// </summary>
/// <param name="_separator"></param>
/// <returns></returns>
public virtual SocketBase SetSeparator(char _separator)
{
separator = _separator;
//设置完成后清除消息
ClearAllQueue();
return this;
}
/// <summary>
/// 设置Debug消息模式
/// </summary>
/// <param name="mode"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 添加接收消息事件
/// </summary>
/// <param name="receiveAction"></param>
public SocketBase AddReceiveEvent(Action<string> receiveAction)
{
if (receiveAction != null)
receiveStringListeners += receiveAction;
return this;
}
public SocketBase AddReceiveEvent(Action<byte[]> receiveAction)
{
if (receiveAction != null)
receiveByteListeners += receiveAction;
return this;
}
public SocketBase AddReceiveEvent(Action<SocketMsg> receiveAction)
{
if (receiveAction != null)
receiveMsgListeners += receiveAction;
return this;
}
/// <summary>
/// 移除接收消息事件
/// </summary>
/// <param name="receiveAction"></param>
public SocketBase RemoveReceiveEvent(Action<string> receiveAction)
{
if (receiveAction != null)
receiveStringListeners -= receiveAction;
return this;
}
public SocketBase RemoveReceiveEvent(Action<byte[]> receiveAction)
{
if (receiveAction != null)
receiveByteListeners -= receiveAction;
return this;
}
public SocketBase RemoveReceiveEvent(Action<SocketMsg> receiveAction)
{
if (receiveAction != null)
receiveMsgListeners -= receiveAction;
return this;
}
//移除所有事件
public SocketBase RemoveAllReceiveEvent()
{
receiveMsgListeners = null;
receiveByteListeners = null;
receiveStringListeners = null;
return this;
}
//获得接收到的消息
protected virtual List<SocketMsg> GetReceiveMsg(int count = -1)
{
int getCount = 0;
List<SocketMsg> temp = new List<SocketMsg>();
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<SocketMsg> 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);
}
}
}
/// <summary>
/// 添加接收消息事件
/// </summary>
/// <param name="receiveAction"></param>
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,
}
}