space-pew/SpacePew/Networking/StreamingClient.cs

65 lines
1.7 KiB
C#
Raw Normal View History

2015-12-04 10:23:49 +01:00
using System.Diagnostics;
using Lidgren.Network;
using System.IO;
using SpacePew.Common;
namespace SpacePew.Networking
{
public class StreamingClient
{
private FileStream _inputStream;
private int _sentOffset;
private int _chunkLen;
private byte[] _tmpBuffer;
private NetConnection _connection;
public StreamingClient(NetConnection conn, string fileName)
{
_connection = conn;
_inputStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
_chunkLen = _connection.Peer.Configuration.MaximumTransmissionUnit - 20;
_tmpBuffer = new byte[_chunkLen];
_sentOffset = 0;
}
public void Heartbeat()
{
if (_inputStream == null)
return;
if (_connection.CanSendImmediately(NetDeliveryMethod.ReliableOrdered, 1))
{
long remaining = _inputStream.Length - _sentOffset;
int sendBytes = (remaining > _chunkLen ? _chunkLen : (int)remaining);
_inputStream.Read(_tmpBuffer, 0, sendBytes);
NetOutgoingMessage message;
if (_sentOffset == 0)
{
message = _connection.Peer.CreateMessage(sendBytes + 8);
message.Write((int)UdpNetworkPacketType.LevelResponse);
message.Write((ulong)_inputStream.Length);
message.Write(Path.GetFileName(_inputStream.Name));
_connection.SendMessage(message, NetDeliveryMethod.ReliableOrdered, 1);
}
message = _connection.Peer.CreateMessage(sendBytes + 8);
message.Write((int)UdpNetworkPacketType.LevelResponse);
message.Write(_tmpBuffer, 0, sendBytes);
_connection.SendMessage(message, NetDeliveryMethod.ReliableOrdered, 1);
_sentOffset += sendBytes;
if (remaining - sendBytes <= 0)
{
_inputStream.Close();
_inputStream.Dispose();
_inputStream = null;
}
}
}
}
}