using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using MrWu.Debug;
using WebSocketSharp;
using WebSocketSharp.Server;
using ErrorEventArgs = WebSocketSharp.ErrorEventArgs;
namespace Server.Net
{
///
/// WebSocket 单个链接的通道
///
public class WChannel: BaseWChannel
{
public long SessionId { get; set; }
///
/// 链接成功事件
///
public static event Action OnConnectedEvt;
///
/// 收到包事件
///
public static event Action OnReceivedEvt;
///
/// 断开连接事件
///
public static event Action OnDisconnectedEvt;
///
/// 发送错误事件
///
public static event Action OnErrorEvt;
//未收齐的字节,写入内存字节
private MemoryStream _memoryStream = new MemoryStream();
private byte[] lengthBytes = new byte[4];
private bool waitReceiveHead = true;
private int waitReceiveLength;
public NameValueCollection WHeaders {
get
{
return this.Headers;
}
}
protected override void OnMessage(MessageEventArgs e)
{
base.OnMessage(e);
lock (_memoryStream)
{
_memoryStream.Write(e.RawData,0,e.RawData.Length);
_memoryStream.Seek(0, SeekOrigin.Begin);
//Debug.Info($"OnMessage,{e.RawData.Length},{_memoryStream.Position},{_memoryStream.Length}");
while (true)
{
long byteLength = _memoryStream.Length - _memoryStream.Position;
//Debug.Log("缓存区长度:" + _memoryStream.Length);
if (waitReceiveHead)
{
// 没收到 包头
if (byteLength < 4)
{
break;
}
else
{
//收到了包头
_memoryStream.Read(lengthBytes, 0, 4);
waitReceiveLength = BitConverter.ToInt32(lengthBytes, 0);
waitReceiveHead = false;
if (waitReceiveLength > GameNetManager.MaxMessageSize)
{
Debug.Error("包体过大:" + waitReceiveLength);
throw new Exception("Message Size :" + waitReceiveLength);
}
}
}
else
{
//还没有收齐,不处理
if (byteLength < waitReceiveLength)
{
break;
}
else
{
byte[] bodyData = new byte[waitReceiveLength];
_memoryStream.Read(bodyData, 0, waitReceiveLength);
//Debug.Info($"收到包体:{_memoryStream.Position},{_memoryStream.Length},bodyLength:{waitReceiveLength}");
waitReceiveHead = true;
OnReceivedEvt?.Invoke(this, bodyData);
}
}
}
//未读取的长度
int noReadLength = (int)(_memoryStream.Length - _memoryStream.Position);
//Debug.Info($"剩余长度:{noReadLength}");
if (noReadLength > 0)
{
byte[] noReadBytes = new byte[noReadLength];
_memoryStream.Read(noReadBytes, 0, noReadLength);
_memoryStream.Seek(0, SeekOrigin.Begin);
_memoryStream.SetLength(0);
_memoryStream.Write(noReadBytes, 0, noReadLength);
}
else
{
_memoryStream.Seek(0, SeekOrigin.Begin);
_memoryStream.SetLength(0);
}
//Debug.Info($"重置收包:{_memoryStream.Position},{_memoryStream.Length}");
}
}
protected override void OnClose(CloseEventArgs e)
{
base.OnClose(e);
OnDisconnectedEvt?.Invoke(this);
}
protected override void OnError(ErrorEventArgs e)
{
base.OnError(e);
OnErrorEvt?.Invoke(this, e.Exception);
}
protected override void OnOpen()
{
base.OnOpen();
OnConnectedEvt?.Invoke(this);
}
}
}