public static ReadFromStreamAsync ( |
||
stream | ||
return | Task |
public static async Task<Packet> ReadFromStreamAsync(NetworkStream stream)
{
Packet packet = new Packet();
byte[] sizeBuffer = new byte[4];
stream.Read(sizeBuffer, 0, 4);
packet.PacketSize = BitConverter.ToInt32(sizeBuffer, 0);
byte[] packetBuffer = new byte[packet.PacketSize];
if(packet.PacketSize != 0)
{
int readProgress = 0;
while(readProgress < packet.PacketSize)
{
int read = await stream.ReadAsync(packetBuffer, readProgress, packet.PacketSize - readProgress);
readProgress += read;
if(read == 0)
{
throw new Exception("NetworkStream failed to read data. Connection may have been lost!");
}
}
}
packet.Opcode = (Opcode)BitConverter.ToInt32(packetBuffer, 0);
packet.Type = (PacketType)BitConverter.ToInt32(packetBuffer, 4);
Array.Copy(packetBuffer, 8, packet.Data, 0, packet.DataSize);
Console.WriteLine("Recieved {0}", packet.DataAsString());
return packet;
}
private async Task ProcessPacketStream() { try { while (IsConnected && (OutgoingPackets.Count != 0 || TcpClient.Available != 0)) { while (IsConnected && TcpClient.Available != 0) { if (ReceivedPacket != null) { ReceivedPacket(this, new PacketEventArgs() { Packet = await Packet.ReadFromStreamAsync(TcpClientStream) }); } IncomingPacketReceieved = true; } if (IsConnected && CanSendPacket && OutgoingPackets.Count != 0) { await OutgoingPackets.Dequeue().WriteToStreamAsync(TcpClientStream); OutgoingPacketCooldown.Restart(); IncomingPacketReceieved = false; } //// We've successfully sent or recieved data so the keepalive can be pushed back. //Keepalive.Reset(); } } catch { // Lost connection with the server // No handling is necessary here as the TCPClient will set Connected to false. if (ServerConnectionDropped != null) { ServerConnectionDropped(this, new ServerConnectionEventArgs() { Message = "Connection to the server has been lost.", Status = ServerConnectionStatus.Disconnected, Timestamp = DateTime.Now }); } } }