private void OnMessage <RequestPacket>(PacketHeader packetHeader, byte[] packetMessage) where RequestPacket : IServerPacket { //Header는 여기서 사용해야할까? //var requestPacket = MessagePackSerializer.Deserialize<dynamic>(packetMessage, MessagePack.Resolvers.ContractlessStandardResolver.Instance); //IServerPacket serverPacket = requestPacket as IServerPacket; var requestPacket = MessagePackSerializer.Typeless.Deserialize(packetMessage) as IServerPacket; //size 119 //MessagePackSerializer.Deserialize<IServerPacket>(bytes); //여기에는 send로 온.. 데이터만 들어오는데.. IClientPacket clientPacket = ProcessManager.Run(requestPacket.PacketId, requestPacket); byte[] bytes = MessagePack.MessagePackSerializer.Typeless.Serialize(clientPacket); PacketHeader packetHeader2 = new PacketHeader { ContentsVersion = packetHeader.ContentsVersion, LogicVersion = packetHeader.LogicVersion, PacketID = requestPacket.PacketId, PacketSize = bytes.Length, EncriptKey = 0, EncriptType = 0, }; //response IRequestItem requestItem = new PacketHolder(PacketHeaderConverter.CreateHeaderToBytes(packetHeader2), requestPacket.PacketId, bytes); Send(requestItem); }
/// <summary> /// 소켓 버퍼로부터 데이터를 수신할 때 마다 호출된다. /// 데이터가 남아 있을 때 까지 계속 패킷을 만들어 callback을 호출 해 준다. /// 하나의 패킷을 완성하지 못했다면 버퍼에 보관해 놓은 뒤 다음 수신을 기다린다. /// </summary> /// <param name="buffer"></param> /// <param name="offset"></param> /// <param name="transffered"></param> public void OnReceive(byte[] buffer, int offset, int transffered, CompletedMessageCallback callback) { // 이번 receive로 읽어오게 될 바이트 수. remainBytes = transffered; // 원본 버퍼의 포지션값. // 패킷이 여러개 뭉쳐 올 경우 원본 버퍼의 포지션은 계속 앞으로 가야 하는데 그 처리를 위한 변수이다. int srcPosition = offset; // 남은 데이터가 있다면 계속 반복한다. while (remainBytes > 0) { bool completed = false; PacketHeader header = new PacketHeader(); // 헤더만큼 못읽은 경우 헤더를 먼저 읽는다. if (currentPosition < PacketHeader.HEADER_SIZE) { // 목표 지점 설정(헤더 위치까지 도달하도록 설정). positionToRead = PacketHeader.HEADER_SIZE; completed = ReadUntil(buffer, ref srcPosition, offset, transffered); if (!completed) { // 아직 다 못읽었으므로 다음 receive를 기다린다. return; } // 헤더 하나를 온전히 읽어왔으므로 메시지 사이즈를 구한다. header = PacketHeaderConverter.BytesToHeader(messageBuffer); messageSize = header.PacketSize; //MessageSize(); //get_body_size(); // 다음 목표 지점(헤더 + 메시지 사이즈). this.positionToRead = messageSize + PacketHeader.HEADER_SIZE; } // 메시지를 읽는다. completed = ReadUntil(buffer, ref srcPosition, offset, transffered); if (completed) { // 패킷 하나를 완성 했다. byte[] messagePacket = new byte[header.PacketSize]; Buffer.BlockCopy(messageBuffer, header.HeaderSize, messagePacket, 0, header.PacketSize); callback(header, messagePacket); clear_buffer(); } } }
public IRequestItem Request <RequestPacket>(RequestPacket requestPacket) where RequestPacket : IServerPacket { byte[] bytes = MessagePack.MessagePackSerializer.Typeless.Serialize(requestPacket); PacketHeader packetHeader = new PacketHeader { ContentsVersion = ContentsVersion, LogicVersion = LogicVersion, PacketID = requestPacket.PacketId, PacketSize = bytes.Length, EncriptKey = 0, EncriptType = 0, }; IRequestItem requestItem = new PacketHolder(PacketHeaderConverter.CreateHeaderToBytes(packetHeader), requestPacket.PacketId, bytes); return(requestItem); }