예제 #1
0
        private void Receive()
        {
            IPEndPoint      ip = null;
            BinaryFormatter bf = new BinaryFormatter();

            //Default Frame fixes guid and length
            FramePieceInfo CurrentPieceInfo = null;
            FramePieceInfo fpi;

            while (!cancellationTokenSource.IsCancellationRequested)
            {
                try
                {
                    byte[] data = ClientReceive.Receive(ref ip);
                    using (MemoryStream ms = new MemoryStream(data))
                    {
                        fpi = bf.Deserialize(ms) as FramePieceInfo;
                        Debug.WriteLine(ms.Length);
                    }
                    Debug.WriteLine($"\nReceived: {fpi.Id}");
                    Debug.WriteLine($"Received: {fpi.FrameBytes.Length}");
                    Debug.WriteLine($"Total: {fpi.TotalLength}");

                    if (CurrentPieceInfo == null)
                    {
                        CurrentPieceInfo = new FramePieceInfo(fpi.FrameBytes, fpi.Id)
                        {
                            TotalLength = fpi.TotalLength
                        };
                    }
                    else if (CurrentPieceInfo.Id == fpi.Id && CurrentPieceInfo.FrameBytes.Length <= CurrentPieceInfo.TotalLength)
                    {
                        //Merging received and current frame
                        byte[] merged = AddImagePiece(CurrentPieceInfo.FrameBytes, fpi.FrameBytes);
                        CurrentPieceInfo.FrameBytes = merged;
                    }
                    else
                    {
                        CheckForHit(CurrentPieceInfo);
                        CurrentPieceInfo = new FramePieceInfo(fpi.FrameBytes, fpi.Id)
                        {
                            TotalLength = fpi.TotalLength
                        };
                    }
                    CheckForHit(CurrentPieceInfo);
                    Debug.WriteLine("Buffer: " + CurrentPieceInfo?.FrameBytes.Length);
                }
                catch (SocketException ex)
                {
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
예제 #2
0
        private void Send()
        {
            using (WebCam webCam = new WebCam())
            {
                while (!cancellationTokenSource.IsCancellationRequested)
                {
                    try
                    {
                        byte[] screenshotBytes = webCam.GetVideoCaptureBytes();
                        Guid   id = Guid.NewGuid();

                        MemoryStream    ms = new MemoryStream();
                        BinaryFormatter bf = new BinaryFormatter();

                        using (var inputMs = new MemoryStream(screenshotBytes))
                            using (BinaryReader br = new BinaryReader(inputMs))
                            {
                                FramePieceInfo fi =
                                    new FramePieceInfo(br.ReadBytes(64000), id)
                                {
                                    TotalLength = screenshotBytes.Length
                                };

                                bf.Serialize(ms, fi);
                                //Thread.Sleep(15);
                                while (fi.FrameBytes.Length > 0)
                                {
                                    ClientSend.Send(ms.GetBuffer(), (int)ms.Length);
                                    ms            = new MemoryStream();
                                    fi.FrameBytes = br.ReadBytes(64000);
                                    bf.Serialize(ms, fi);
                                    Thread.Sleep(15);
                                }
                            }

                        Debug.WriteLine($"Sent: {screenshotBytes.Length}");
                        Thread.Sleep(10);
                    }
                    catch (ObjectDisposedException oex)
                    {
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
        }
예제 #3
0
 private void CheckForHit(FramePieceInfo CurrentPieceInfo)
 {
     if (CurrentPieceInfo.FrameBytes.Length == CurrentPieceInfo.TotalLength)
     {
         Debug.WriteLine("Hit");
         Application.Current.Dispatcher.Invoke(() =>
         {
             try
             {
                 OnFrameChange(new ImageBrush(Screenshot.ByteToBitMapSource(CurrentPieceInfo.FrameBytes)));
             }
             catch (Exception ex)
             {
             }
         });
     }
 }