Пересылка скриншота по сети - C#

Узнай цену своей работы

Формулировка задачи:

Хочу сделать программу для удаленного управления за моим рабочим столом, для этого я должен сделать скрииншот и отправить его по сокету. Но у меня возникла проблема. Код:
Socket _ClientS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_ClientS.Connect(_IpEndP);
Console.WriteLine("Нажмите на любую клавишу, что бы сделать скриншот...");
Console.ReadKey();
Bitmap _BitMap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppRgb);
using (Graphics _Gr = Graphics.FromImage(_BitMap))
{
      _Gr.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
}
byte[] _Data = Encoding.Default.GetBytes(_BitMap);
_ClientS.Send(_Data);
_ClientS.Shutdown(SocketShutdown.Both);
_ClientS.Close();
Проблема заключается в том, что я не могу отправить _BitMap. Как это сделать? И как на другом конце сокета можно принять эти данные и конвертировать в Bitmap? Заранее благодарен за помощь
У меня был вариант конвертировать _BitMap в строку, отправлять, но как эту строку обратно в Bitmap конвертировать, я не знаю

Решение задачи: «Пересылка скриншота по сети»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Project
{
    public partial class MainWindow : Form
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void MainWindow_Load(object sender, EventArgs e)
        {
            // сервер
            new Action( () =>
             {
                 var Listener = new System.Net.Sockets.Socket( System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp );
                 Listener.Bind( new System.Net.IPEndPoint( System.Net.IPAddress.Any, 440 ) );
                 Listener.Listen( 20 );
                 while (true)
                     new Action<System.Net.Sockets.Socket>( Client_Listen ).BeginInvoke( Listener.Accept(), null, null );
             } ).BeginInvoke( null, null );
        }
 
        private void Client_Listen(System.Net.Sockets.Socket Socket)
        {
            try
            {
                // прослушивание
                var Stream = new System.Net.Sockets.NetworkStream( Socket );
                var Output = new System.IO.BinaryWriter( Stream );
                byte[] bytes = new byte[] { };
                bytes = ConvertImageToBytes( GetScreenshot() ); // преобразуем скриншот в байты
                Output.Write( bytes.Length ); // отправляем размер
                Output.Write( bytes ); // отправляем байты
                //...
            }
            finally
            {
                Socket.Close(); // закрываем соединение
                GC.Collect(); // очищаем мусор
            }
        }
 
        public Bitmap GetScreenshot()
        {
            var Bitmap = new System.Drawing.Bitmap( SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height );
            using (var gc = Graphics.FromImage( Bitmap ))
            {
                gc.CopyFromScreen( new Point(), new Point(), Bitmap.Size );
            }
            return Bitmap;
        }
 
        public byte[] ConvertImageToBytes(System.Drawing.Bitmap bitmap)
        {
            using (var mstream = new System.IO.MemoryStream())
            {
                bitmap.Save( mstream, System.Drawing.Imaging.ImageFormat.Bmp );
                return mstream.ToArray();
            }
        }
 
 
 
        private async void btn_Receive_Click(object sender, EventArgs e)
        {
            var Socket = new System.Net.Sockets.Socket( System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp );
            var rslt = await Task.Factory.StartNew<bool>( () =>
             {
                 try
                 {
                     Socket.Connect("localhost", 440);
                     return true;
                 }
                 catch
                 {
                     return false;
                 }
             } );
            if (!rslt)
            {
                MessageBox.Show("Не удалось подключиться к серверу");
            }
            try
            {
                var Stream = new System.Net.Sockets.NetworkStream( Socket );
                var Input = new System.IO.BinaryReader( Stream );
 
                int length = await Task.Factory.StartNew<int>( () =>
                 {
                     return Input.ReadInt32();
                 } );
 
                byte[] bytes = await Task.Factory.StartNew<byte[]>( () =>
                {
                    return Input.ReadBytes( length );
                } );
 
                pictureBox_Screenshot.Image = Bitmap.FromStream( new System.IO.MemoryStream( bytes ) );
                MessageBox.Show( "OK" );
            }
            catch
            {
                MessageBox.Show( "Не удалось получить скриншот." );
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.5 из 5