193 lines
4.6 KiB
C#
193 lines
4.6 KiB
C#
// ***********************************************************************
|
|
// Assembly : Unity
|
|
// Author : Kimch
|
|
// Created :
|
|
//
|
|
// Last Modified By : Kimch
|
|
// Last Modified On :
|
|
// ***********************************************************************
|
|
// <copyright file= "GameConnectorAdapter" company=""></copyright>
|
|
// <summary></summary>
|
|
// ***********************************************************************
|
|
namespace G
|
|
{
|
|
using System.IO;
|
|
using F.Network;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public class GameNetworkAdapter : INetworkAdapter
|
|
{
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
private IConnector _connector;
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
private MemoryStream _stream = new MemoryStream(2048);
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="connector"></param>
|
|
public void Initialize(IConnector connector)
|
|
{
|
|
_connector = connector;
|
|
}
|
|
|
|
public void Close()
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取token接口
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public string GetToken()
|
|
{
|
|
return "token";
|
|
}
|
|
|
|
public bool SendPing()
|
|
{
|
|
_connector.Send(new GamePacket
|
|
{
|
|
//id = msg.C2SHeartBeat.MessageType,
|
|
//data = new msg.C2SHeartBeat()
|
|
});
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="packet"></param>
|
|
/// <param name="destination"></param>
|
|
/// <returns></returns>
|
|
public bool Serialize<T>(T packet, Stream destination) where T : IPacket
|
|
{
|
|
try
|
|
{
|
|
F.IO.LittleEndianBinaryWriter.WriteUInt16(destination, (ushort)packet.id);
|
|
F.IO.LittleEndianBinaryWriter.WriteUInt16(destination, 0);//ERROR
|
|
F.IO.LittleEndianBinaryWriter.WriteUInt16(destination, 0);//FLAG
|
|
|
|
_stream.SetLength(0);
|
|
F.IO.LittleEndianBinaryWriter.WriteString(_stream, GetToken());
|
|
//ProtoBuf.Serializer.Serialize(_stream, packet.data);
|
|
F.IO.LittleEndianBinaryWriter.WriteUInt16(destination, (ushort)_stream.Length);//lENGTH
|
|
|
|
//写入token
|
|
_stream.WriteTo(destination);
|
|
|
|
return true;
|
|
}
|
|
catch (System.Exception ex)
|
|
{
|
|
UnityEngine.Debug.LogException(ex);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 反序列化包头
|
|
/// </summary>
|
|
/// <param name="source"></param>
|
|
/// <param name="customErrorData"></param>
|
|
/// <returns></returns>
|
|
public IPacketHeader DeserializePacketHeader(Stream source, out object customErrorData)
|
|
{
|
|
var header = new GamePacketHeader();
|
|
try
|
|
{
|
|
header.id = F.IO.LittleEndianBinaryReader.ReadUInt16(source);
|
|
header.error = F.IO.LittleEndianBinaryReader.ReadUInt16(source);
|
|
header.packetFlag = F.IO.LittleEndianBinaryReader.ReadUInt16(source);
|
|
header.packetLength = F.IO.LittleEndianBinaryReader.ReadUInt16(source);
|
|
customErrorData = null;
|
|
if (header.packetLength > 1024 * 1024)
|
|
{
|
|
customErrorData = "packet length too large.";
|
|
}
|
|
}
|
|
catch (System.Exception ex)
|
|
{
|
|
customErrorData = ex.Message;
|
|
}
|
|
return header;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="packetHeader"></param>
|
|
/// <param name="source"></param>
|
|
/// <param name="customErrorData"></param>
|
|
/// <returns></returns>
|
|
public IPacket DeserializePacket(IPacketHeader packetHeader, Stream source, out object customErrorData)
|
|
{
|
|
var packet = new GamePacket();
|
|
try
|
|
{
|
|
var header = (GamePacketHeader)packetHeader;
|
|
if (header.error == GamePacket.ERROR_CODE_OK)
|
|
{
|
|
packet.id = header.id;
|
|
|
|
var packetLength = packetHeader.packetLength;
|
|
if (source.Length - source.Position >= packetLength)
|
|
{
|
|
if (_stream.Capacity < packetLength)
|
|
{
|
|
_stream.Capacity = ((packetLength >> 10) << 11);
|
|
}
|
|
|
|
_stream.Position = 0;
|
|
_stream.SetLength(packetLength);
|
|
source.Read(_stream.GetBuffer(), 0, packetLength);
|
|
packet.token = F.IO.LittleEndianBinaryReader.ReadString(_stream);
|
|
//packet.data = msg.MessageHelper.Deserialize(_stream, header.id);
|
|
customErrorData = null;
|
|
}
|
|
else
|
|
{
|
|
customErrorData = "DeserializePacket: packet length is invalid.";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
packet.id = header.id;
|
|
packet.data = null;
|
|
packet.error = header.error;
|
|
|
|
var packetLength = packetHeader.packetLength;
|
|
if (source.Length - source.Position >= packetLength)
|
|
{
|
|
source.Position += packetLength;
|
|
}
|
|
customErrorData = null;
|
|
}
|
|
}
|
|
catch (System.Exception ex)
|
|
{
|
|
customErrorData = ex.Message;
|
|
}
|
|
return packet;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 固定长度
|
|
/// </summary>
|
|
public int packetHeaderLength
|
|
{
|
|
get
|
|
{
|
|
return 8;
|
|
}
|
|
}
|
|
}
|
|
}
|