Пересылка скриншота по сети - C#
Формулировка задачи:
Хочу сделать программу для удаленного управления за моим рабочим столом, для этого я должен сделать скрииншот и отправить его по сокету. Но у меня возникла проблема.
Код:
Проблема заключается в том, что я не могу отправить _BitMap.
Как это сделать? И как на другом конце сокета можно принять эти данные и конвертировать в Bitmap? Заранее благодарен за помощь
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 конвертировать, я не знаю
Решение задачи: «Пересылка скриншота по сети»
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( "Не удалось получить скриншот." );
}
}
}
}