C#高性能大容量SOCKET同時(九):ブレークポイント継続


ブレークポイントのアップロード
ブレークポイントの継続は主にファイルのアップロードやダウンロードに使用され、一般的にはアップロードが開始されたとき、サーバは前回アップロードしたサイズを返し、アップロードが完了したら-1を返す.ダウンロードが開始されると、クライアントからローカルでダウンロードされたサイズが報告され、サーバは位置情報に基づいてデータを送信するため、アップロードダウンロードプロトコルにはSizeサイズが必要です.例えば、私たちのプロトコルフォーマットです.
アップロード開始:
クライアント->サーバ
{
[Request]
Command=Upload
Dir=Dir#ディレクトリ、フルパス名
FileName=FileName#ファイル名(パスを除く)
}
サーバ->クライアント
{
[Response]
Command=Upload
Code=Error Code#エラーコード
Message=Message#エラーが発生した場合は、エラー記述情報を返します.
FileSize=FileSize#アップロードされたファイルのサイズ.再送信用
}
したがって、クライアントのアップロード要求を受信する際には、サーバが最後にファイルアドレスを受信したことを送信する必要があります.
        public bool DoUpload()
        {
            string dirName = "";
            string fileName = "";
            if (m_incomingDataParser.GetValue(ProtocolKey.DirName, ref dirName) & m_incomingDataParser.GetValue(ProtocolKey.FileName, ref fileName))
            {
                if (dirName == "")
                    dirName = Program.FileDirectory;
                else
                    dirName = Path.Combine(Program.FileDirectory, dirName);
                fileName = Path.Combine(dirName, fileName);
                Program.Logger.Info("Start upload file: " + fileName);
                if (m_fileStream != null) // 
                {
                    m_fileStream.Close();
                    m_fileStream = null;
                    m_fileName = "";
                }
                if (File.Exists(fileName))
                {
                    if (!CheckFileInUse(fileName)) // 
                    {
                        m_fileName = fileName;
                        m_fileStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite);
                        m_fileStream.Position = m_fileStream.Length; // 
                        m_outgoingDataAssembler.AddSuccess();
                        m_outgoingDataAssembler.AddValue(ProtocolKey.FileSize, m_fileStream.Length);
                    }
                    else
                    {
                        m_outgoingDataAssembler.AddFailure(ProtocolCode.FileIsInUse, "");
                        Program.Logger.Error("Start upload file error, file is in use: " + fileName);
                    }
                }
                else
                {
                    m_fileName = fileName;
                    m_fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                    m_fileStream.Position = m_fileStream.Length; // 
                    m_outgoingDataAssembler.AddSuccess();
                    m_outgoingDataAssembler.AddValue(ProtocolKey.FileSize, m_fileStream.Length);
                }
            }
            else
                m_outgoingDataAssembler.AddFailure(ProtocolCode.ParameterError, "");
            return DoSendResult();
        }

ブレークポイントのダウンロード
ダウンロード開始:
クライアント->サーバ
{
[Request]
Command=Download
Dir=Dir#ディレクトリ、フルパス名
FileName=FileName#ファイル名(パスを除く)
FileSize=FileSize#クライアントローカルファイルサイズ、ブレークポイント再送信用
PacketSize=PacketSize#転送パケットサイズ、単位KB、速度テスト用
}
サーバ->クライアント
{
[Response]
Command= Download
Code=Error Code#エラーコード
Message=Message#エラーが発生した場合は、エラー記述情報を返します.
}
        public bool DoDownload()
        {
            string dirName = "";
            string fileName = "";
            Int64 fileSize = 0;
            int packetSize = 0;
            if (m_incomingDataParser.GetValue(ProtocolKey.DirName, ref dirName) & m_incomingDataParser.GetValue(ProtocolKey.FileName, ref fileName)
                & m_incomingDataParser.GetValue(ProtocolKey.FileSize, ref fileSize) & m_incomingDataParser.GetValue(ProtocolKey.PacketSize, ref packetSize))
            {
                if (dirName == "")
                    dirName = Program.FileDirectory;
                else
                    dirName = Path.Combine(Program.FileDirectory, dirName);
                fileName = Path.Combine(dirName, fileName);
                Program.Logger.Info("Start download file: " + fileName);
                if (m_fileStream != null) // 
                {
                    m_fileStream.Close();
                    m_fileStream = null;
                    m_fileName = "";
                    m_sendFile = false;
                }
                if (File.Exists(fileName))
                {
                    if (!CheckFileInUse(fileName)) // 
                    {
                        m_fileName = fileName;
                        m_fileStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite);
                        m_fileStream.Position = fileSize; // 
                        m_outgoingDataAssembler.AddSuccess();
                        m_sendFile = true;
                        m_packetSize = packetSize;
                    }
                    else
                    {
                        m_outgoingDataAssembler.AddFailure(ProtocolCode.FileIsInUse, "");
                        Program.Logger.Error("Start download file error, file is in use: " + fileName);
                    }
                }
                else
                {
                    m_outgoingDataAssembler.AddFailure(ProtocolCode.FileNotExist, "");
                }
            }
            else
                m_outgoingDataAssembler.AddFailure(ProtocolCode.ParameterError, "");
            return DoSendResult();
        }

マルチスレッド同時ダウンロード
ブレークポイント再送の1つのアプリケーションは同時ダウンロードであり、クライアントが複数のスレッドから同じファイルを同時要求し、各スレッドの下のファイルの一部をすべてダウンロードした後、各データブロックを1つのファイルに統合することである.このサービス側もクライアントプロトコルも変更する必要はありませんが、ダウンロードロジックの変更が必要です.
マルチスレッド同時アップロード
これは、主にサーバが複数のデータファイルを1つのファイルにマージするプロトコルロジックを提供するために通信を定義する必要があります.
DEMOダウンロードアドレス:http://download.csdn.net/detail/sqldebug_fan/7467745免責声明:このコードは、C#がポートプログラミングを完了したことを示すために使用され、学習と研究にのみ使用され、ビジネス用途には使用されません.レベルが限られていて、C#も初学に属して、間違いは避けられないので、指摘と指導を歓迎します.メールアドレス:[email protected].