Exemple #1
0
        private void Send() //Send 버튼을 눌렀을 때 thrsend 쓰레드 안에서 돌아갈 함수
        {
            try
            {
                while (ConnectedToServer)      //서버에 연결되어 있을 때
                {
                    buttonstream.Position = 0; //파일의 인덱스를 맨앞으로 이동시키고

                    FileInfo fi = new FileInfo(openFileDialog.FileName);

                    Fp = new FilePacket();

                    Fp.FileName = fi.Name;                                                         //파일의 경로를 생각한 짧은 경로를 얻어오기위해 FileInfo 사용
                    Fp.FileSize = fi.Length;                                                       //파일의 길이를 FileSize로 입력

                    Invoke(new MethodInvoker(delegate()                                            //Control을 건드리는 부분 --> Invoke 사용
                    {
                        ProgressBar.Minimum = 0;                                                   // 초기값 0
                        ProgressBar.Maximum = (int)(buttonstream.Length / Fp.FileData.Length) + 1; //보내야 하는 횟수
                        ProgressBar.Value   = 0;                                                   // 현재 값 0
                    }
                                             ));
                    for (int i = 0; i < (int)(buttonstream.Length / Fp.FileData.Length) + 1; i++)
                    {                                                          //파일의 크기를 버퍼의 크기로 나누고 나머지부분 전송을 위해 + 1번만큼 더 전송함
                        buttonstream.Read(Fp.FileData, 0, Fp.FileData.Length); //파일을 버퍼에 읽어와서
                        Fp.Type = 0;                                           //보통의 파일 전송 타입
                        Packet.Serialize(Fp).CopyTo(this.SendBuffer, 0);       //SendBuffer로 Serialize
                        NetStream.Write(SendBuffer, 0, SendBuffer.Length);     //네트워크 스트림에 쓴다
                        NetStream.Flush();                                     //보낸다

                        ClearBuffer(SendBuffer);                               //SendBuffer의 모든 index를 0으로 초기화

                        Invoke(new MethodInvoker(delegate()                    //Control을 건드리는 부분
                        {
                            ProgressBar.Value++;                               //Value를 증가시킴(Progressbar 수치 증가)
                        }
                                                 ));
                    }
                    //파일 전송 끝

                    buttonstream.Dispose();
                    buttonstream.Close();               //
                    FileTextBox.Clear();                //파일스트림을 닫아주고, 파일경로 텍스트박스 초기화

                    Invoke(new MethodInvoker(delegate() //컨트롤을 건드리는 부분
                    {
                        ListViewItem item = new ListViewItem(new string[] { fi.Name, fi.Length.ToString() });
                        listView.Items.Add(item);           //전송을 완료하면 서버의 경로에 이 파일도 저장되므로
                    }
                                             ));

                    threader = new Thread(new ThreadStart(Receive)); //Abort되었던 쓰레드를 다시 생성해줌
                    threader.Start();                                //시작
                    thrsender.Abort();                               //전송 쓰레드 Abort
                }
            }
            catch
            {//쓰레드가 중단되었습니다. 같은 무시할 수 있는 오류를 깔끔히 처리하기 위해서 비워둠
            }
        }
        public void sendFile(string sender, string path)
        {
            FileInfo fileInfo = null;

            try
            {
                fileInfo = new FileInfo(path);
            }
            catch (Exception exc)
            {
                Console.WriteLine("Fehler beim Lesen der Dateiinfo! - {0}", exc.Message);
                return;
            }

            if (fileInfo.Exists)
            {
                var filePacket = new FilePacket
                {
                    Size           = fileInfo.Length,
                    CreationTime   = fileInfo.CreationTime,
                    LastAccessTime = fileInfo.LastAccessTime,
                    LastWriteTime  = fileInfo.LastWriteTime,
                    Name           = fileInfo.Name,
                    Receiver       = sender
                };

                var filePacketBytes     = this.serialize(filePacket);
                var filePacketSizeBytes = BitConverter.GetBytes(filePacketBytes.Length);

                var clientStream = this.client.GetStream();

                using (var memoryStream = new MemoryStream())
                {
                    memoryStream.Write(filePacketSizeBytes, 0, filePacketSizeBytes.Length);
                    memoryStream.WriteByte((byte)Core.PacketType.File);
                    memoryStream.Write(filePacketBytes, 0, filePacketBytes.Length);

                    memoryStream.WriteTo(clientStream);
                }

                byte[] buffer = new byte[this.client.SendBufferSize];
                using (var fileStream = new FileStream(path, FileMode.Open))
                {
                    fileStream.Seek(0, SeekOrigin.Begin);

                    int size = 0;
                    while ((size = fileStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        clientStream.Write(buffer, 0, size);
                    }
                }
            }
            else
            {
                Console.WriteLine("Die Datei '{0}' existiert nicht!", fileInfo.FullName);
            }
        }
 // Methoden
 public Core()
 {
     this.receivedBufferOffset = 0;
     this.currentPacketSize    = 0;
     this.currentPacketType    = PacketType.Invalid;
     this.packetStream         = new MemoryStream();
     this.currentFilePacket    = null;
     this.receivedFileSize     = 0;
 }
Exemple #4
0
        private void OnSaveMapCommand(Client client, string command, string[] args)
        {
            if (!_enabled)
            {
                return;
            }
            FilePacket mapData = Packet.Create(PacketType.FILE) as FilePacket;

            mapData.Bytes = Encoding.UTF8.GetBytes(this.m_map.ToJson());
            mapData.Name  = args.Length == 0 ? this.m_map.Name : args[0];
            client.SendToClient(mapData);
        }
Exemple #5
0
 /// <summary>
 /// 获取文件服务信息
 /// </summary>
 /// <param name="id">类型ID</param>
 /// <param name="dataArray">原始字节数组</param>
 private void GetFileServertMessage(TypeIdentification id, byte[] dataArray)
 {
     try
     {
         var message = new FilePacket(dataArray);
         switch (id)
         {
         case TypeIdentification.F_FR_NA_1_NR:
         {
             FileServerArrived(this,
                               new TransmitEventArgs <TypeIdentification, FilePacket>(id, message));
             break;
         }
         }
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
        /// <summary>
        /// 文件数据包
        /// </summary>
        /// <param name="packet">文件包</param>
        private void SendFileServerMessage(FilePacket packet)
        {
            try
            {
                packet.TransmitSequenceNumber    = appMessageManager.TransmitSequenceNumber;
                packet.ReceiveSequenceNumber     = appMessageManager.RealReceiveSequenceNumber;
                packet.ASDU.AppDataPublicAddress = appMessageManager.ASDUADdress;

                var id = TypeIdentification.F_FR_NA_1_NR;//文件服务
                eventTypeIDManager.AddEventProcess(new EventProperty(id));
                var frame = packet;
                var array = frame.GetAPDUDataArray();
                MainTypeIProcess(array, array.Length, appMessageManager.WaitTime, id);

                appMessageManager.UpdateTransmitSequenceNumber();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "SendFileServerMessage");
            }
        }
        public override void DoLoginedHandlerWork(HttpContext context)
        {
            Message jsonMessage;
            bool    isUpdate = false;

            //检查用户有没有更新报表权限,
            if (CommonOperRightHelper.CheckMenuCode(base.loginOperator, "gxbbmb"))
            {
                isUpdate = context.Request.Form["isUpdate"] == null ? false : bool.Parse(context.Request.Form["isUpdate"].ToString());
            }
            string strUploadPath = string.Format("{0}\\ReportTemplate\\{1}\\{2}\\{3}\\",
                                                 context.Server.MapPath("~"), base.loginOperator.CompanyID, base.loginOperator.OperID, System.DateTime.Now.ToString("yyyyMMdd"));

            jsonMessage = new Message()
            {
                Result = false, TxtMessage = "权限验证失败,可能原因:\n1、数据中心通讯失败。\n2、系统管理员未与您分配对应操作权限。"
            };
            string fileName = string.Empty;

            //创建路径记录上传者账号信息
            if (CommonOperRightHelper.CheckMenuCode(base.loginOperator, "drbbmb"))
            {
                if (context.Request.Files != null && context.Request.Files.Count == 1)
                {
                    if (!Directory.Exists(strUploadPath))
                    {
                        Directory.CreateDirectory(strUploadPath);
                    }
                    HttpPostedFile postedFile = context.Request.Files[0];
                    fileName = strUploadPath + System.Web.HttpUtility.UrlDecode(Path.GetFileName(postedFile.FileName));
                    if (fileName != "" && Path.GetExtension(fileName) == ".pkf")
                    {
                        try
                        {
                            postedFile.SaveAs(fileName);
                            FilePacket pft = new FilePacket(fileName);
                            pft.OpenPacket(strUploadPath);
                            pft = null;
                            ImportReport(strUploadPath, isUpdate);
                            string ShowInfo = string.Empty;
                            ShowInfo += string.Format("成功{0}个。<br>", success);
                            int i = 0;
                            foreach (string tmp in successName)
                            {
                                i++;
                                ShowInfo += string.Format("{0}、【{1}】", i, tmp);
                            }
                            if (failed > 0)
                            {
                                ShowInfo += string.Format("<br>失败{0}个。<br>", failed);
                                i         = 0;
                                foreach (string tmp in failedReasons)
                                {
                                    i++;
                                    ShowInfo += string.Format("{0}、【{1}】", i, tmp);
                                }
                            }
                            jsonMessage = new Message()
                            {
                                Result = true, TxtMessage = ShowInfo
                            };
                        }
                        catch (Exception ex)
                        {
                            jsonMessage = new Message()
                            {
                                Result = false, TxtMessage = ex.Message
                            };
                            if (File.Exists(fileName))
                            {
                                File.Delete(fileName);
                            }
                        }
                    }
                }
            }
            context.Response.Write(JSon.TToJson <Message>(jsonMessage));
        }
Exemple #8
0
        private void Receive()
        {
            try
            {
                int count = 1;  //현재 파일의 인덱스
                int nRead = 0;  //총 전송 횟수

                while (ConnectedToServer)
                {
                    this.NetStream.Read(this.ReadBuffer, 0, this.ReadBuffer.Length); //읽어오고
                    Packet p = (Packet)Packet.Deserialize(this.ReadBuffer);          //해독해서

                    switch (p.Type)                                                  //타입에 따라 나눈다
                    {
                    case 0:                                                          //보통의 파일 전송일 때
                    {
                        Fp    = (FilePacket)p;                                       //파일을 보내기 위한 클래스로 다운캐스팅
                        nRead = (int)Fp.FileSize / Fp.FileData.Length + 1;           //파일을 받아야 하는 횟수
                        int    fileIndex = 1;                                        //파일 중복 시 앞에 번호를 붙여주기 위한 인덱스
                        string fileName  = PathTextBox.Text + "\\" + Fp.FileName;

                        if (count == 1)                   //파일의 첫부분을 받았다면
                        {
                            while (File.Exists(fileName)) //파일이 있는지 확인하고
                            {
                                fileName = PathTextBox.Text + "\\" + "(" + fileIndex.ToString() + ")" + Fp.FileName;
                                fileIndex++;         //앞에 번호를 붙여 파일 이름이 겹치지 않도록 해준다
                            }
                            f = new FileStream(fileName, FileMode.Create, FileAccess.Write);
                            //중복되지 않는 파일 이름을 얻은 후 파일스트림을 생성한다(생성으로)
                        }


                        f.Write(Fp.FileData, 0, Fp.FileData.Length);

                        this.Invoke(new MethodInvoker(delegate()        //컨트롤 건드리는 부분
                            {
                                this.ProgressBar.Maximum = nRead;       //최대전송횟수로 초기화
                                this.ProgressBar.Minimum = 0;           //최소는 0
                                this.ProgressBar.Value   = count;       //count는 현재 몇번 받았는지 나타냄
                                count++;
                            }
                                                      ));

                        if (count > nRead)          //count==nRead일 때 파일을 모두 받음
                                                    //따라서 count++을 한 직후 count>nRead 라면 파일을 다 받았으므로
                        {
                            count = 1;              //count를 다시 1로 초기화하고
                            f.Dispose();
                            f.Close();              //파일의 인덱스는 파일이 닫지 않으면 유지되기 때문에
                                                    //파일의 전송을 모두 끝낸 시점에서 닫아준다.
                        }
                        break;
                    }

                    case 1:                                      //리스트뷰에 파일을 띄우기 위한 Type일 때
                    {
                        Fl = (FileList)p;                        //리스트 뷰에 파일을 띄우기 위한 클래스로 다운캐스팅
                        this.Invoke(new MethodInvoker(delegate() //컨트롤을 건드리는 부분
                            {
                                ListViewItem item = new ListViewItem(new string[] { Fl.FileName, Fl.FileSize.ToString() });
                                listView.Items.Add(item);       //아이템을 파일이름, 사이즈로 생성 후 Add
                            }));
                        break;
                    }

                    case 2:     //파일을 달라는 request일 때-->클라이언트에서는 받을 일 없음
                    {
                        break;
                    }
                    }
                }
            }

            /*
             * catch (SocketException)                 //처음에 서버 연결이 끊겼을 때 자동으로 Disconnect 버튼이
             * {                                       //Connect 버튼으로 바뀌도록 하기 위해 만든 코드였는데,
             *  Cli = null;                         //서버와 연결이 끊길 때 발생하는 Exception이
             *  NetStream = null;                   //SocketException 아니라 밑의 IOException이라는 것을 알고 주석처리하였다.
             *  if (f != null)
             *      f.Close();
             *  ConnectedToServer = false;
             *
             *  Invoke(new MethodInvoker(delegate ()
             *  {
             *      ConnectBtn.Text = "Connect";
             *      ConnectBtn.ForeColor = Color.Black;
             *      listView.Items.Clear();
             *  }));
             *
             *  threader.Abort();
             * }*/
            catch (System.IO.IOException)        //서버와의 연결이 끊겼을 경우 or IO 예외가 발생했을 경우
            {
                Cli       = null;
                NetStream = null;               //넷스트림과 클라이언트를 널로만듬
                if (f != null)
                {
                    f.Close();                          //파일스트림이 널이 아니라면 닫고
                }
                ConnectedToServer = false;              //서버와 연결상태를 거짓으로 설정

                Invoke(new MethodInvoker(delegate()     //컨트롤을 건드리는 부분
                {
                    ConnectBtn.Text      = "Connect";   //버튼의 텍스트를 Connect로
                    ConnectBtn.ForeColor = Color.Black; //색깔을 검정색으로
                    listView.Items.Clear();             //리스트뷰를 비움
                }));

                threader.Abort();                 //리시브 쓰레드 종료
                thrsender.Abort();                //보내는 쓰레드 종료
            }
            catch
            {//쓰레드가 중단되었습니다. 같은 무시할 수 있는 오류를 깔끔히 처리하기 위해서 비워둠
            }
        }
Exemple #9
0
        private void Receive()  //전송이 오면 받는 함수-> 쓰레드로 돌아감
        {
            try
            {
                int count = 1;                                                       //현재 파일의 받고 있는 부분
                int nRead = 0;                                                       //파일을 몇번 전송해야 하는가

                while (CliConnected)                                                 //클라이언트가 서버에 연결되어 있는 동안
                {
                    this.NetStream.Read(this.ReadBuffer, 0, this.ReadBuffer.Length); //전송이 온 경우 네트워크 스트림을 읽고
                    Packet p = (Packet)Packet.Deserialize(this.ReadBuffer);          //해독한 후

                    switch (p.Type)                                                  //타입에 따라 행동한다
                    {
                    case 0:                                                          //보통의 파일 전송타입일 때
                    {
                        Fp    = (FilePacket)p;                                       //파일 전송을 위한 클래스로 다운캐스팅
                        nRead = (int)Fp.FileSize / Fp.FileData.Length + 1;           //몇 번 보내야 하는가
                        int    fileIndex = 1;                                        //파일 이름의 중복을 처리하기 위한 변수
                        string fileName  = PathTextBox.Text + "\\" + Fp.FileName;    //파일 이름을 저장하고

                        if (count == 1)                                              //파일의 첫부분을 받았을 때
                        {
                            while (File.Exists(fileName))                            //파일의 이름이 존재한다면
                            {
                                fileName = PathTextBox.Text + "\\" + "(" + fileIndex.ToString() + ")" + Fp.FileName;
                                fileIndex++;                                                 //파일 이름이 중복될 경우 앞에 번호를 붙이는 식으로 중복을 피함
                            }
                            f = new FileStream(fileName, FileMode.Create, FileAccess.Write); //중복되지 않는 파일 이름으로 파일을 생성
                        }

                        f.Write(Fp.FileData, 0, Fp.FileData.Length);     //파일에 데이터를 쓴다
                                                                         //이 때 파일 안에서의 position은 파일을 닫지 않으면 계속 이어서 쓸 수 있기 때문에
                                                                         //파일의 끝부분을 받았을 때 파일스트림을 닫아준다

                        this.Invoke(new MethodInvoker(delegate()         //컨트롤을 건드리는 부분
                            {
                                this.ProceedTextBox.Text = this.ProceedTextBox.Text + "\r\nFile Receive....  " + count + "/" + nRead + "  Done\r\n";
                                this.ProceedTextBox.Select(ProceedTextBox.Text.Length, 0);
                                this.ProceedTextBox.ScrollToCaret();    // 현재 전송된 부분 / 전체 전송 부분 을 출력하고, 텍스트박스의 가장 밑으로 스크롤한다
                                count++;
                            }));

                        if (count > nRead)          //count = nRead일 때가 마지막 전송이므로, count가 nRead보다 커진다면
                        {
                            count = 1;              //다른 파일을 받을 수 있도록 count = 1로 초기화 해주고
                            f.Dispose();
                            f.Close();              //파일을 다 썼으므로 파일을 닫는다.
                        }
                        break;
                    }

                    case 1:     //파일의 리스트 Type일 때-->서버가 받을 일 없음
                    {
                        break;
                    }

                    case 2:     //파일을 달라는 request일 때
                    {
                        try
                        {
                            Rq = (Request)p;            //요청 클래스를 받아서 다운캐스팅
                            f  = new FileStream(PathTextBox.Text + "\\" + Rq.FileName, FileMode.Open, FileAccess.Read);
                            //파일 이름을 받았고, 경로도 알고 있기 때문에 파일스트림 생성 가능
                            Fp = new FilePacket();                                 //파일 전송을 위한 클래스 인스턴스 생성

                            Fp.Type     = 0;                                       //타입은 보통의 파일 전송
                            Fp.FileName = Rq.FileName;                             //파일 이름
                            Fp.FileSize = f.Length;                                //파일 크기
                            for (int i = 0; i < (int)(f.Length / Fp.FileData.Length) + 1; i++)
                            {                                                      //파일 크기를 나누고 버퍼의 크기로 나누고, 나머지부분을 한번 더 전송하기 위해 +1을 함
                                f.Read(Fp.FileData, 0, Fp.FileData.Length);        //파일의 데이터를 버퍼의 크기만큼 읽어와 버퍼에 넣어줌
                                Packet.Serialize(Fp).CopyTo(this.SendBuffer, 0);   //Serialize해서 SendBuffer에 넣어줌
                                NetStream.Write(SendBuffer, 0, SendBuffer.Length); //네트워크 스트림에 쓰고
                                NetStream.Flush();                                 //보냄

                                ClearBuffer(SendBuffer);                           //버퍼를 초기화 한다
                            }
                            f.Dispose();
                            f.Close();              //파일 읽기가 끝났으므로 파일을 닫아준다.
                        }
                        catch (Exception ex)
                        {
                        }

                        break;
                    }
                    }
                }
            }
            catch (Exception ex)
            {//예상되는 무시해도 되는 오류들을 깔끔히 처리하기 위해 catch문을 비워두었다.ex)쓰레드가 중단되었습니다
            }
        }
        private void parseReceivedBuffer(int receivedSize)
        {
            //////////////////////////////////////////////////////
            // ------------------------------------------------ //
            // | Paketgröße | Pakettyp |  Paket  | Dateibytes | //
            // ------------------------------------------------ //
            // |   4 Bytes  |  1 Byte  | X Bytes |  X Bytes   | //
            // ------------------------------------------------ //
            //////////////////////////////////////////////////////

            // Wenn gerade kein Paket gelesen wird
            if (this.currentPacketType == PacketType.Invalid)
            {
                // Wenn die empfangen Bytes nicht ausreichen, um die Paketgröße und den Pakettyp zu lesen
                if (receivedSize < sizeof(int) + sizeof(byte))
                {
                    this.receivedBufferOffset = receivedSize;
                    // Weiter empfangen...
                }
                // Paketgröße und Pakettyp lesen
                else
                {
                    this.currentPacketSize = BitConverter.ToInt32(this.receivedBuffer, this.receivedBufferOffset);
                    if (Enum.IsDefined(typeof(PacketType), this.receivedBuffer[this.receivedBufferOffset + sizeof(int)]))
                    {
                        this.currentPacketType = (PacketType)this.receivedBuffer[this.receivedBufferOffset + sizeof(int)];

                        int offset = sizeof(int) + sizeof(byte);

                        // Wenn noch mehr gelesen werden kann
                        if (receivedSize - offset > 0)
                        {
                            this.receivedBufferOffset += offset;

                            this.parseReceivedBuffer(receivedSize - offset);
                        }
                        else
                        {
                            this.receivedBufferOffset = 0;
                            // Weiter empfangen...
                        }
                    }
                    else
                    {
                        this.currentPacketSize = 0;
                        Console.WriteLine("Empfangener Pakettyp '{0}' ist ungültig!", this.receivedBuffer[this.receivedBufferOffset + sizeof(int)]);

                        this.receivedBufferOffset = 0;
                        // Weiter empfangen...
                    }
                }
            }
            // Dateipaket lesen
            else if (this.currentPacketType == PacketType.File)
            {
                // Wenn das ganze Paket gelesen werden kann
                if (receivedSize >= this.currentPacketSize)
                {
                    // Alle Bytes des Pakets in den Stream schreiben
                    this.packetStream.Write(this.receivedBuffer, this.receivedBufferOffset, this.currentPacketSize);
                    // Paket ist fertig!
                    // Wenn gültiges Paket: Datei empfangen, sonst zurück setzen
                    try
                    {
                        this.currentFilePacket = Newtonsoft.Json.JsonConvert.DeserializeObject <FilePacket>(Encoding.UTF8.GetString(this.packetStream.ToArray()));
                        this.currentPacketType = PacketType.FileData;
                        //Console.WriteLine(Encoding.UTF8.GetString(this.packetStream.ToArray()));
                        //Console.WriteLine("Dateipaket empfangen");
                        this.ReceiveFileInfo(this.currentFilePacket.Receiver, this.currentFilePacket.Name, this.currentFilePacket.Size);
                    }
                    catch
                    {
                        this.currentPacketType = PacketType.Invalid;
                        Console.WriteLine("Dateipaket fehlerhaft!");
                    }

                    // Paketstream für nächstes Paket zurücksetzen
                    this.packetStream.Position = 0;
                    this.packetStream.SetLength(0);

                    // Wenn noch mehr Bytes gelesen werden können
                    if (receivedSize > this.currentPacketSize)
                    {
                        this.receivedBufferOffset += this.currentPacketSize;

                        this.parseReceivedBuffer(receivedSize - this.currentPacketSize);
                    }
                    else
                    {
                        this.receivedBufferOffset = 0;
                        // Weiter empfangen...
                    }

                    this.currentPacketSize = 0;
                }
                // Wenn ein Teil des Pakets gelesen werden kann
                else
                {
                    // Verfügbare Bytes in den Paketstream schreiben
                    this.packetStream.Write(this.receivedBuffer, this.receivedBufferOffset, receivedSize);

                    this.receivedBufferOffset = 0;
                    // Weiter empfangen...
                }
            }
            // Datei lesen
            else if (this.currentPacketType == PacketType.FileData)
            {
                // Wenn die Datei noch empfangen wird
                if (this.receivedFileSize < this.currentFilePacket.Size)
                {
                    long restSize = this.currentFilePacket.Size - this.receivedFileSize;

                    // Wenn die fehlenden Bytes vorhanden sind
                    if (receivedSize >= restSize)
                    {
                        byte[] fileBuffer = new byte[restSize];
                        Array.Copy(this.receivedBuffer, this.receivedBufferOffset, fileBuffer, 0, restSize);
                        //Console.WriteLine("{0} Bytes der Datei empfangen", restSize);
                        //Console.WriteLine("Datei komplett empfangen");
                        // Callback für Dateiverarbeitung
                        this.receivedFileSize += restSize;
                        this?.ReceiveFile(this.currentFilePacket.Receiver, fileBuffer, this.receivedFileSize, this.currentFilePacket.Size);

                        this.currentPacketSize = 0;
                        this.currentPacketType = PacketType.Invalid;
                        this.currentFilePacket = null;
                        this.receivedFileSize  = 0;

                        // Wenn noch mehr Bytes gelesen werden können
                        if (receivedSize > restSize)
                        {
                            this.receivedBufferOffset += (int)restSize;

                            this.parseReceivedBuffer(receivedSize - (int)restSize);
                        }
                        else
                        {
                            this.receivedBufferOffset = 0;
                            // Weiter empfangen...
                        }
                    }
                    else
                    {
                        byte[] fileBuffer = new byte[receivedSize];
                        Array.Copy(this.receivedBuffer, this.receivedBufferOffset, fileBuffer, 0, receivedSize);
                        //Console.WriteLine("{0} Bytes der Datei empfangen", receivedSize);
                        // Callback für Dateiverarbeitung
                        this?.ReceiveFile(this.currentFilePacket.Receiver, fileBuffer, this.receivedFileSize, this.currentFilePacket.Size);

                        this.receivedFileSize += receivedSize;

                        this.receivedBufferOffset = 0;
                        // Weiter empfangen...
                    }
                }
                else
                {
                    Console.WriteLine("WIE BIN ICH HIER HIN GEKOMMEN???");
                    System.Diagnostics.Debugger.Break();
                }
            }
            // Objekt lesen
            else if (this.currentPacketType == PacketType.Object)
            {
                // Wenn das ganze Paket gelesen werden kann
                if (receivedSize >= this.currentPacketSize)
                {
                    // Alle Bytes des Pakets in den Stream schreiben
                    this.packetStream.Write(this.receivedBuffer, this.receivedBufferOffset, this.currentPacketSize);
                    // Paket ist fertig!
                    //Console.WriteLine("Dateipaket empfangen");
                    //if (this.name == null)
                    //{
                    //	try
                    //	{
                    //		var data = (Newtonsoft.Json.Linq.JObject)this.deserialize(this.packetStream.ToArray());
                    //		if (data["$ConnectionInfoName"] != null)
                    //		{
                    //			this.name = (string)data["$ConnectionInfoName"];
                    //			Console.WriteLine("{0} hat sich verbunden", this.name);
                    //		}
                    //		else
                    //		{
                    //			throw new Exception("Es sollte erst ein Name an den Server geschickt werden!");
                    //		}
                    //	}
                    //	catch
                    //	{

                    //	}
                    //}
                    //else
                    {
                        var data = (JObject)this.deserialize(this.packetStream.ToArray());
                        foreach (var pair in data)
                        {
                            //this.ReceiveObject?.Invoke(pair.Key, JsonConvert.DeserializeObject(pair.Value.ToString()));
                            if (pair.Key != "Receiver")
                            {
                                this.ReceiveObject?.Invoke(data["Receiver"].ToString(), pair.Key, pair.Value.ToString());
                            }
                        }
                    }

                    // Pakettyp und Paketstream für nächstes Paket zurücksetzen
                    this.currentPacketType     = PacketType.Invalid;
                    this.packetStream.Position = 0;
                    this.packetStream.SetLength(0);

                    // Wenn noch mehr Bytes gelesen werden können
                    if (receivedSize > this.currentPacketSize)
                    {
                        this.receivedBufferOffset += this.currentPacketSize;

                        this.parseReceivedBuffer(receivedSize - this.currentPacketSize);
                    }
                    else
                    {
                        this.receivedBufferOffset = 0;
                        // Weiter empfangen...
                    }

                    this.currentPacketSize = 0;
                }
                // Wenn ein Teil des Pakets gelesen werden kann
                else
                {
                    // Verfügbare Bytes in den Paketstream schreiben
                    this.packetStream.Write(this.receivedBuffer, this.receivedBufferOffset, receivedSize);

                    this.receivedBufferOffset = 0;
                    // Weiter empfangen...
                }
            }
        }