Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2018, 11:01   #1
BabaOla
Пользователь
 
Регистрация: 06.04.2018
Сообщений: 11
По умолчанию Проблемы с сетевым взаимодействием

КЛИЕНТ:
Код:
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;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
 
namespace client
{
    public partial class Form1 : Form
    {
        Socket socket;
        byte[] buffer;
        MemoryStream stream;
        public Bitmap bmp;
 
        private Bitmap TakeScreenShot(Screen currentScreen)
        {
            Bitmap bmpScreenShot = new Bitmap(currentScreen.Bounds.Width,
                                              currentScreen.Bounds.Height,
                                              System.Drawing.Imaging.PixelFormat.Format32bppArgb);
 
            Graphics gScreenShot = Graphics.FromImage(bmpScreenShot);
 
            gScreenShot.CopyFromScreen(currentScreen.Bounds.X,
                                       currentScreen.Bounds.Y,
                                       0, 0,
                                       currentScreen.Bounds.Size,
                                       CopyPixelOperation.SourceCopy);
            return bmpScreenShot;
        }
 
        
 
 
        public Form1()
        {
            InitializeComponent();
 
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            
            stream = new MemoryStream();
            try
            {
                socket.Connect("127.0.0.1", 904);
                //socket.Connect("212.75.211.2", 904);
            }
            catch
            {
                MessageBox.Show("Connection ERROR");
                Application.Exit();
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            //socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Image pr = TakeScreenShot(Screen.PrimaryScreen);
            bmp = new Bitmap(pr);
            pictureBox1.Image = bmp;
            bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
            buffer = stream.ToArray();  
            socket.Send(buffer);
            buffer = null;
        }
    }
}
СЕРВЕР:
Код:
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;
using System.IO;
using System.Threading;
using System.Net;
using System.Net.Sockets;
 
namespace server
{
    public partial class Form1 : Form
    {
        Socket sosket;
        Socket client;
        byte[] buffer;
        MemoryStream stream;
 
        public Form1()
        {
            InitializeComponent();
            sosket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            buffer = new byte[1000000];
            stream = new MemoryStream(buffer);
 
            
        }
 
        public void tikl ()
        {
            sosket.Bind(new IPEndPoint(IPAddress.Any, 904));
            sosket.Listen(5);
            client = sosket.Accept();
            client.Receive(buffer);
            pictureBox1.Image = Image.FromStream(stream);
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Thread tr = new Thread(tikl);
            tr.Start();
        }
 
  
    }
}

Проблема:
Программы работают как надо только 1 раз. При нажатии кнопки на клиенте в пикчербоксе и клиента и сервера появляется скриншот. При повторном нажатии кнопки в клиенте скриншот обновляется только в клиенте( на сервер в пикчер бокс он не передается. Там висит старый скриншот.) При третьем нажатии на кнопку в клиенте он зависает, а на сервере висит все тот же старый скриншот. Помогите пожалуйста разобраться).


_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 06.04.2018 в 11:31.
BabaOla вне форума Ответить с цитированием
Старый 06.04.2018, 17:04   #2
ZnZ
Пользователь
 
Регистрация: 14.06.2017
Сообщений: 45
По умолчанию

Наверное потому что ты после каждого пакета ждёшь новое подключение? Не?
ZnZ вне форума Ответить с цитированием
Старый 09.04.2018, 09:33   #3
BabaOla
Пользователь
 
Регистрация: 06.04.2018
Сообщений: 11
По умолчанию

Подскажите пожалуйста как это исправить.
BabaOla вне форума Ответить с цитированием
Старый 09.04.2018, 11:23   #4
ZnZ
Пользователь
 
Регистрация: 14.06.2017
Сообщений: 45
По умолчанию

приём клиентов вынеси в отдельный поток, и когда есть подключение, получаешь его socket, и запускает второй поток в котором уже будет крутиться Receive для этого socket
ZnZ вне форума Ответить с цитированием
Старый 09.04.2018, 11:23   #5
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Вот код примера сервера:
Код:
    internal static class Program
    {
        private static byte[] buffer;
        private static Socket client;

        private static Socket sosket;
        private static MemoryStream stream;

        private static void Main( string[] args )
        {
            sosket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
            buffer = new byte[ 1000000 ];
            stream = new MemoryStream( buffer );
            sosket.Bind( new IPEndPoint( IPAddress.Any, 904 ) );
            sosket.Listen( 5 );
            var cts = new CancellationTokenSource();
            var task = ListenImages( sosket, cts.Token ).ContinueWith( it => WriteLine( it.Exception ) );
            ReadKey( true );
            cts.Cancel();

            task.Wait();
        }

        private static Task ListenImages( Socket socket, CancellationToken cancellationToken )
        {
            return Task.Run( async () =>
                             {
                                 var cancellationTokenTaskSource = new TaskCompletionSource< object >();
                                 cancellationToken.Register( cancellationTokenTaskSource.SetCanceled );
                                 var cancellationTokenTask = cancellationTokenTaskSource.Task;
                                 var connectedClientTask = AcceptAsync( socket );
                                 await Task.WhenAny( connectedClientTask, cancellationTokenTask );
                                 cancellationToken.ThrowIfCancellationRequested();
                                 var connectedClient = connectedClientTask.Result;
                                 cancellationToken.Register( () => connectedClient.Close() );
                                 do
                                 {
                                     var it = ReceiveAsync( connectedClient, buffer, 0, buffer.Length, SocketFlags.None );
                                     await Task.WhenAny( it, cancellationTokenTask );
                                     cancellationToken.ThrowIfCancellationRequested();

                                     WriteLine( it.Result );
                                 } while ( !cancellationToken.IsCancellationRequested );
                             }, cancellationToken );
        }

        private static Task< int > ReceiveAsync( Socket socket, byte[] bufferArray, int offset, int count, SocketFlags flags )
        {
            var tcs = new TaskCompletionSource< int >( socket );
            socket.BeginReceive( bufferArray, offset, count, flags, iar =>
                                                                    {
                                                                        try
                                                                        {
                                                                            tcs.SetResult( socket.EndReceive( iar ) );
                                                                        }
                                                                        catch ( Exception exc )
                                                                        {
                                                                            tcs.SetException( exc );
                                                                        }
                                                                    }, null );
            return tcs.Task;
        }

        private static Task< Socket > AcceptAsync( Socket socket )
        {
            var acceptAsync = Task.Factory.FromAsync( socket.BeginAccept, socket.EndAccept, null );
            acceptAsync.ConfigureAwait( false );
            return acceptAsync;
        }
    }
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 10.04.2018, 09:08   #6
BabaOla
Пользователь
 
Регистрация: 06.04.2018
Сообщений: 11
По умолчанию

Поправил, но проблема все равно осталась
СЕРВЕР
Код:
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;
using System.IO;
using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace server
{
    public partial class Form1 : Form
    {
        Socket sosket;
        Socket client;
        byte[] buffer;
        MemoryStream stream;

        public Form1()
        {
            InitializeComponent();
            sosket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            buffer = new byte[1000000];
            stream = new MemoryStream(buffer);


        }
        public void tik2()
        {
            while(true)
            {
            
            client.Receive(buffer);
             pictureBox1.Image = Image.FromStream(stream);
            }
        }

        public void tikl()
        {
            sosket.Bind(new IPEndPoint(IPAddress.Any, 904));
            sosket.Listen(5);
            
            while (true)
            {
                client = sosket.Accept();
                Thread tr2 = new Thread(tik2);
                tr2.Start();
            }
            
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread tr = new Thread(tikl);
            tr.Start();
        }


    }
}
КЛИЕНТ:

Код:
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;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace client
{
    public partial class Form1 : Form
    {
        Socket socket;
        byte[] buffer;
        MemoryStream stream;
        public Bitmap bmp;

        private Bitmap TakeScreenShot(Screen currentScreen)
        {
            Bitmap bmpScreenShot = new Bitmap(currentScreen.Bounds.Width,
                                              currentScreen.Bounds.Height,
                                              System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            Graphics gScreenShot = Graphics.FromImage(bmpScreenShot);

            gScreenShot.CopyFromScreen(currentScreen.Bounds.X,
                                       currentScreen.Bounds.Y,
                                       0, 0,
                                       currentScreen.Bounds.Size,
                                       CopyPixelOperation.SourceCopy);
            return bmpScreenShot;
        }




        public Form1()
        {
            InitializeComponent();

            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            stream = new MemoryStream();
            try
            {
                socket.Connect("127.0.0.1", 904);
                //socket.Connect("212.75.211.2", 904);
            }
            catch
            {
                MessageBox.Show("Connection ERROR");
                Application.Exit();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //buffer = null;
            Image pr = TakeScreenShot(Screen.PrimaryScreen);
            bmp = new Bitmap(pr);
            pictureBox1.Image = bmp;
            bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
            buffer = stream.ToArray();
            socket.Send(buffer);
            //buffer = null;
        }
    }
}
BabaOla вне форума Ответить с цитированием
Старый 10.04.2018, 10:15   #7
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Клиент у меня был такой:
Код:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Net.Sockets;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            socket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );

            try
            {
                socket.Connect( "127.0.0.1", 904 );
                //socket.Connect("212.75.211.2", 904);
            }
            catch
            {
                MessageBox.Show( "Connection ERROR" );
                Application.Exit();
            }
        }

        private readonly Socket socket;

        private Bitmap TakeScreenShot( Screen currentScreen )
        {
            Bitmap bmpScreenShot = new Bitmap( currentScreen.Bounds.Width, currentScreen.Bounds.Height, PixelFormat.Format32bppArgb );

            Graphics gScreenShot = Graphics.FromImage( bmpScreenShot );

            gScreenShot.CopyFromScreen( currentScreen.Bounds.X, currentScreen.Bounds.Y, 0, 0, currentScreen.Bounds.Size, CopyPixelOperation.SourceCopy );
            return bmpScreenShot;
        }

        private void button1_Click( object sender, EventArgs e )
        {
            //socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Image pr = TakeScreenShot( Screen.PrimaryScreen );
            var memoryStream = new MemoryStream();
            pr.Save( memoryStream, ImageFormat.Png );
            var buffer = memoryStream.ToArray();
            socket.Send( buffer );
        }
    }
}
Сервер
Код:
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            var sosket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
            buffer = new byte[ 1000000 ];
            sosket.Bind( new IPEndPoint( IPAddress.Any, 904 ) );
            sosket.Listen( 5 );
            cancellationTokenSource = new CancellationTokenSource();
            socketReaderTask = ListenImages( sosket, cancellationTokenSource.Token ).ContinueWith( it => Debug.WriteLine( it.Exception ) );
        }

        private readonly byte[] buffer;

        private readonly CancellationTokenSource cancellationTokenSource;
        private readonly Task socketReaderTask;

        protected override void OnClosing( CancelEventArgs e )
        {
            base.OnClosing( e );
            cancellationTokenSource.Cancel();
            socketReaderTask.Wait();
        }

        private Task ListenImages( Socket socket, CancellationToken cancellationToken )
        {
            return Task.Run( async () =>
                             {
                                 var cancellationTokenTaskSource = new TaskCompletionSource< object >();
                                 cancellationToken.Register( cancellationTokenTaskSource.SetCanceled );
                                 var cancellationTokenTask = cancellationTokenTaskSource.Task;
                                 var connectedClientTask = AcceptAsync( socket );
                                 await Task.WhenAny( connectedClientTask, cancellationTokenTask );
                                 cancellationToken.ThrowIfCancellationRequested();
                                 var connectedClient = connectedClientTask.Result;
                                 cancellationToken.Register( () => connectedClient.Close() );
                                 do
                                 {
                                     var it = ReceiveAsync( connectedClient, buffer, 0, buffer.Length, SocketFlags.None );
                                     await Task.WhenAny( it, cancellationTokenTask );
                                     cancellationToken.ThrowIfCancellationRequested();
                                     Invoke( new Action( () =>
                                                         {
                                                             pictureBox1.Image?.Dispose();
                                                             pictureBox1.Image = Image.FromStream( new MemoryStream( buffer, 0, it.Result ) );
                                                         } ) );
                                 } while ( !cancellationToken.IsCancellationRequested );
                             }, cancellationToken );
        }

        private static Task< int > ReceiveAsync( Socket socket, byte[] bufferArray, int offset, int count, SocketFlags flags )
        {
            var tcs = new TaskCompletionSource< int >( socket );
            socket.BeginReceive( bufferArray, offset, count, flags, iar =>
                                                                    {
                                                                        try
                                                                        {
                                                                            tcs.SetResult( socket.EndReceive( iar ) );
                                                                        }
                                                                        catch ( Exception exc )
                                                                        {
                                                                            tcs.SetException( exc );
                                                                        }
                                                                    }, null );
            return tcs.Task;
        }

        private static Task< Socket > AcceptAsync( Socket socket )
        {
            var acceptAsync = Task.Factory.FromAsync( socket.BeginAccept, socket.EndAccept, null );
            acceptAsync.ConfigureAwait( false );
            return acceptAsync;
        }
    }
}
Не давай организму поблажки, каждый день тренируй его в шашки..

Последний раз редактировалось Скарам; 10.04.2018 в 10:21.
Скарам вне форума Ответить с цитированием
Старый 11.04.2018, 05:20   #8
BabaOla
Пользователь
 
Регистрация: 06.04.2018
Сообщений: 11
По умолчанию

Код сервера жесть сложный для новичка))). Тяжело будет разобраться).
BabaOla вне форума Ответить с цитированием
Старый 11.04.2018, 05:37   #9
BabaOla
Пользователь
 
Регистрация: 06.04.2018
Сообщений: 11
По умолчанию

Можно ли этот код как то упростить без использования виртуальных асинхронных наследований дочерних классов и тд?))
BabaOla вне форума Ответить с цитированием
Старый 11.04.2018, 09:49   #10
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Этот код вспомогательный, в отдельный класс
Код:
 public static class Extensions
    {
        public static Task< int > ReceiveAsync( this Socket socket, byte[] bufferArray, int offset, int count, SocketFlags flags )
        {
            var tcs = new TaskCompletionSource< int >( socket );
            socket.BeginReceive( bufferArray, offset, count, flags, iar =>
                                                                    {
                                                                        try
                                                                        {
                                                                            tcs.SetResult( socket.EndReceive( iar ) );
                                                                        }
                                                                        catch ( Exception exc )
                                                                        {
                                                                            tcs.SetException( exc );
                                                                        }
                                                                    }, null );
            return tcs.Task;
        }

        public static Task< Socket > AcceptAsync( this Socket socket )
        {
            var acceptAsync = Task.Factory.FromAsync( socket.BeginAccept, socket.EndAccept, null );
            acceptAsync.ConfigureAwait( false );
            return acceptAsync;
        }

        public static async Task< T > AwaitOrCancelAsync< T >( this Task< T > task, CancellationToken token )
        {
            var cancellationTokenTaskSource = new TaskCompletionSource< object >();
            using (  token.Register( cancellationTokenTaskSource.SetCanceled ) )
            {
                var cancellationTokenTask = cancellationTokenTaskSource.Task;
                await Task.WhenAny( task, cancellationTokenTask );
                token.ThrowIfCancellationRequested();
            }

            return await task;
        }
    }
Код сервера
Код:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            var sosket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
            buffer = new byte[ 1000000 ];
            sosket.Bind( new IPEndPoint( IPAddress.Any, 904 ) );
            sosket.Listen( 5 );
            cancellationTokenSource = new CancellationTokenSource();
            socketReaderTask = ListenImages( sosket, cancellationTokenSource.Token ).ContinueWith( it => Debug.WriteLine( it.Exception ) );
        }

        private readonly byte[] buffer;

        private readonly CancellationTokenSource cancellationTokenSource;
        private readonly Task socketReaderTask;

        protected override void OnClosing( CancelEventArgs e )
        {
            base.OnClosing( e );
            cancellationTokenSource.Cancel();
            socketReaderTask.Wait();
        }

        private async Task ListenImages( Socket socket, CancellationToken cancellationToken )
        {
            var connectedClient = await socket.AcceptAsync().AwaitOrCancelAsync( cancellationToken );
            cancellationToken.Register( () => connectedClient.Close() );
            do
            {
                var result = await connectedClient.ReceiveAsync( buffer, 0, buffer.Length, SocketFlags.None ).AwaitOrCancelAsync( cancellationToken );

                pictureBox1.Image?.Dispose();
                pictureBox1.Image = Image.FromStream( new MemoryStream( buffer, 0, result ) );
            } while ( !cancellationToken.IsCancellationRequested );
        }
    }
Так не понятно? Если нет, то с потоками и т.д. Код с потоками я писать не хочу.
Не давай организму поблажки, каждый день тренируй его в шашки..

Последний раз редактировалось Скарам; 11.04.2018 в 11:25.
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с сетевым подключением. Cthutq66a Компьютерное железо 9 09.08.2012 21:36
Проблема с взаимодействием классов Jugger Помощь студентам 2 06.01.2012 18:44
Проблема с взаимодействием динамической и статической памяти - обращение к статической переменной Comst95 Паскаль, Turbo Pascal, PascalABC.NET 1 03.01.2012 18:46
Проблемы с сетевым подключением Arigato Операционные системы общие вопросы 5 16.11.2010 15:17
Проблема с сетевым драйвером pike2008 Компьютерное железо 0 08.10.2010 02:41