using System;
using System.Collections.Specialized;
using System.IO;
using System.Threading.Tasks;
using MrWu.Debug;
using WebSocketSharp;
using WebSocketSharp.Server;
using ErrorEventArgs = WebSocketSharp.ErrorEventArgs;
namespace Server.Net
{
public class GameWChannel : 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 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}");
long byteLength = _memoryStream.Length - _memoryStream.Position;
byte[] bodyData = new byte[byteLength];
_memoryStream.Read(bodyData, 0, (int)byteLength);
//Debug.Info($"收到包体:{_memoryStream.Position},{_memoryStream.Length},bodyLength:{waitReceiveLength}");
waitReceiveHead = true;
OnReceivedEvt?.Invoke(this, bodyData);
_memoryStream.Seek(0, SeekOrigin.Begin);
_memoryStream.SetLength(0);
}
}
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);
}
}
}