Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
1

Проверьте код. Почему то не работает (клиент-серверное приложение)

10.03.2013, 23:34. Показов 3727. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Что то не хочет работать...
передаю картинку...делается скрин экрана в режиме постоянного времени.
При запуске сервера, он зависает на цикле
C#
1
2
3
4
while (!Listener.Pending())
                {
                    Thread.Sleep(1000);
                }
Клиент подключается, но как я понял, из за зависание сервера ничего не передаётся...
Подскажите что не так...

Вот код клиента
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
using System.Reflection;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
 
namespace Helper
{
    public partial class mainform : Form
    {
        public mainform()
        {
            InitializeComponent();
        }
        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        public static extern bool SetProcessWorkingSetSize(IntPtr handle, int minimumWorkingSetSize, int maximumWorkingSetSize);
        static NetworkStream Stream;
        static System.Net.IPAddress IP = System.Net.IPAddress.Parse("127.0.0.1");
        const int port = 10203;
 
        static void Write(Bitmap s)
        {
            try
            {
                MemoryStream ms = new MemoryStream();
                s.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] bitmapData = ms.GetBuffer();
                Stream.Write(bitmapData, 0, bitmapData.Length);
            }
            catch
            {
                MessageBox.Show("Что-то не работает((((");
            }
        }
 
private void button1_Click(object sender, EventArgs e)
        {
            SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
        
            TcpClient tcpClient = new TcpClient();
            try
            {
                tcpClient.Connect(IP, port);
                Stream = tcpClient.GetStream();
                while (true)
                {
                    Write(Get_PrScreen()); //передаётся функция, которая делает скрин (возвращает тип Bitmap)               
                }
            }
            catch
            {
                MessageBox.Show("Сервер не доступен! Повторите попытку.");
            }
        }
}
А так выглядит сервер

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;
 
namespace WindowsFormsApplication3
{
    public partial class Server : Form
    {
        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        public static extern bool SetProcessWorkingSetSize(IntPtr handle, int minimumWorkingSetSize, int maximumWorkingSetSize);
        const int port = 10203;
        Connection NewConnection;
        
 
        public Server()
        {
            InitializeComponent();
            
        }
 
        public class Connection
        {
            TcpListener Listener;
            public TcpClient Client;
            public NetworkStream Stream;
            Bitmap image;
            Server serv;
 
            public Connection(TcpListener L)
            {
                try
                {
                    Listener = L;
                    Client = Listener.AcceptTcpClient();
                    Stream = Client.GetStream();
                }
                catch
                {
                    Stream.Close();
                    Client.Close();
                    Thread.CurrentThread.Abort();
                }
            }
 
            public void StartRead(object obj)
            {
                serv = new Server();
                try
                {
                    while (true)
                    {
                        byte[] received = new byte[350000];
                        Stream.Read(received, 0, 350000);
                        MemoryStream ms = new MemoryStream(received);
                        image = (Bitmap)Image.FromStream(ms);
                        Bitmap newimage = new Bitmap(image.Width, image.Height);
                        Graphics gf = Graphics.FromImage(newimage);
                        gf.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                        gf.DrawImage(image, 0, 0, image.Width, image.Height);
                        serv.pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
                        serv.pictureBox1.BackgroundImage = newimage;
                        serv.pictureBox1.Refresh();
                    }
                }
                catch
                {
                    Stream.Close();
                    Client.Close();
                    Thread.CurrentThread.Abort();
                }
            }
        }
 
        public void StartConnect()
        {
            SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
            TcpListener Listener = new TcpListener(IPAddress.Any, port);
            Listener.Start();
            while (true)
            {
                while (!Listener.Pending())
                {
                    Thread.Sleep(1000);
                }
                NewConnection = new Connection(Listener);
                ThreadPool.QueueUserWorkItem(new WaitCallback(NewConnection.StartRead));
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {            
            StartConnect();
        }
 
 
    }
}
ПыСы: когда передавал текст, то всё работало.., но делалось это в консоли

Добавлено через 30 минут
Щас продебажил...клиент всё передаёт...но сервер не принимает, т.к. до приёма у него дело не доходит.. висит на том самом цикле
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.03.2013, 23:34
Ответы с готовыми решениями:

Не работает клиент-серверное приложение
Всем доброго. Вот после несколько дневного поиска нашел готовый клиент сервер на Форме. Работает,...

Клиент-серверное приложение не работает через интернет
Тема такая есть сервер(TCPListener) и клиент(TCPClient) приложения в локальной сети работаю без...

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос: как определить что...

Клиент- серверное приложение с бд
Товарищи программисты, может предоставить пример реализации клиент- сервера на с# с подключенной...

8
 Аватар для MrGladus
178 / 178 / 50
Регистрация: 06.01.2013
Сообщений: 392
11.03.2013, 01:28 2
Вам надо делать асинхронный или многопоточный сервер. Зависание из-за того что главный поток занят приемом сообщения и не может в это время обрабатывать форму. Вроде так. Пример многопоточного и асинхронного сервера.
0
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
11.03.2013, 01:54  [ТС] 3
первая ссылка не работает...пожалуйста вышлите ещё раз
0
 Аватар для MrGladus
178 / 178 / 50
Регистрация: 06.01.2013
Сообщений: 392
11.03.2013, 02:06 4
C#
1
http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server
Добавлено через 3 минуты
Просто погуглите "C# threaded server" или "C# многопоточный сервер". Смысл заключается в том чтобы сделать прием сообщений в отдельном потоке чтобы не загружать основной поток приложения этим заданием, тогда приложение не будет "виснуть".
0
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
11.03.2013, 13:54  [ТС] 5
Переделал сервер...сделал его многопоточным.
Но почему то после закрытия программы (при условии что сервер был запущен) она всё ещё остаётся запущенной в VS, хотя форма закрывается.
Подскажите что нужно принудительно завершать
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
 
namespace MyServer
{
    public partial class Server : Form
    {
        int Port = 10203;
        Bitmap image;
        NetworkStream stream;
        TcpClient client;
        TcpListener tcpListener;
        Thread listenThread;
        bool flagSt = false;
 
        public Server()
        {
            InitializeComponent();
        }
 
        public void StartRead(object obj)
        {
            stream = client.GetStream();
            pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
 
            while (true)
            {
                int bytesRead = 0;
 
                try
                {
                    byte[] received = new byte[350000];
                    bytesRead = stream.Read(received, 0, 350000);
                    MemoryStream ms = new MemoryStream(received);
                    image = (Bitmap)Image.FromStream(ms);
                    Bitmap newimage = new Bitmap(image.Width, image.Height);
                    Graphics gf = Graphics.FromImage(newimage);
                    //gf.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    gf.DrawImage(image, 0, 0, image.Width, image.Height);
 
                    pictureBox1.BackgroundImage = newimage;
                    pictureBox1.Refresh();
                    newimage.Dispose();
                    image.Dispose();
                }
 
                catch
                {
                    break;
                }
 
                if (bytesRead == 0)
                    break;
            }
 
            stream.Close();
            client.Close();
            Thread.CurrentThread.Abort();
        }
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            flagSt = true;
            tcpListener = new TcpListener(IPAddress.Any, Port);
            listenThread = new Thread(new ThreadStart(ListenForClients));
            listenThread.Start();
        }
 
        private void ListenForClients()
        {
            tcpListener.Start();
            while (true)
            {
                client = tcpListener.AcceptTcpClient();
 
                //create a thread to handle communication 
                //with connected client
                Thread clientThread = new Thread(new ParameterizedThreadStart(StartRead));
                clientThread.Start(client);
            }
 
        }
        
    }
}
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
11.03.2013, 14:19 6
Приложение не будет завершать работу, пока остаются работающие основные потоки. А у вас второй основной поток выполняется вечно. Можно сделать второй поток фоновым, тогда будет работать нормально.

C#
1
listenThread.IsBackground = true;
0
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
11.03.2013, 16:51  [ТС] 7
это поставить вместо
C#
1
listenThread.Start();
если да, то с вашим вариантом клиент не может подключиться к серверу...
0
 Аватар для MrGladus
178 / 178 / 50
Регистрация: 06.01.2013
Сообщений: 392
11.03.2013, 16:55 8
Разумеется не может - поток надо вначале запустить, а уже потом делать фоновым:
C#
1
2
listenThread.Start();
listenThread.IsBackground = true;
1
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
11.03.2013, 21:24  [ТС] 9
спасибо)...всё работает.
но есть ещё один вопрос...связанный с клиентом. С начало всё работает, но спустя какое то время вылетает catch, который находится внутри функции Write()
посмотрите пожалуйста, в чём может быть дело...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
using System.Reflection;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
 
namespace Helper
{
    public partial class mainform : Form
    {
        public mainform()
        {
            InitializeComponent();
        }
 
        static NetworkStream Stream;
        static System.Net.IPAddress IP = System.Net.IPAddress.Parse("127.0.0.1");
        const int port = 10203;
 
        void Write(Bitmap s)
        {
            try
            {
                MemoryStream ms = new MemoryStream();
                s.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] bitmapData = ms.GetBuffer();
                Stream.Write(bitmapData, 0, bitmapData.Length);
            }
            catch
            {
                timer2.Enabled = false;
                MessageBox.Show("Что-то не работает((((");
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            TcpClient tcpClient = new TcpClient();
            try
            {
                tcpClient.Connect(IP, port);
                Stream = tcpClient.GetStream();
                
                timer2.Enabled = true;
            }
            catch
            {
                MessageBox.Show("Сервер не доступен! Повторите попытку.");
            }
        }
 
        private void timer2_Tick(object sender, EventArgs e)
        {
            Write(Get_PrScreen()); //передаёт функцию, которая делает скрин
        }
 
    }
}
Добавлено через 2 часа 9 минут
в общем додумался я до того, что можно отловить исключение)...
текст у него такой: Не удаётся записать данные в транспортное соединение: Программа на вашем хост-компьютере разорвала установленное соединение.
Подскажите, что нужно исправить...как я понял в коде сервера..., если он и есть хост-компьютер
0
11.03.2013, 21:24
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.03.2013, 21:24
Помогаю со студенческими работами здесь

Клиент-серверное приложение
Заинтересовался написанием клиент-серверных приложений, с чего начать? что написать? есть ли...

Клиент-серверное приложение
Есть приложение Windows Forms, нужно реализовать другое приложение, которое бы работало на другом...

клиент-серверное приложение
собственно проблема заключается в том, что при запуске клиента, и нажатии на кнопку (отправление...

Клиент-серверное приложение
Клиент-серверное приложение между процессов с помощью именованых каналов Здравствуйте. Тут...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Создание макробота, как способа экономии времени и варианта ИИ.
Hrethgir 28.01.2025
Чисто теоретически, создание ИИ на ПК можно разделить на части. Создать бота отвечающего за железо (эмулирование вкл, выкл, мышь, клавиатура), другой бот осуществляет распознавание изображений,. . .
[Golang] 121. Best Time to Buy and Sell Stock
alhaos 28.01.2025
В этой задаче мы получаем слайс целых чисел, которые означают цену акции в разные моменты времени, и должны вернуть максимально возможную прибыль от купли продажи акции. / / . . .
Проектирование и моделирование
hw_wired 28.01.2025
Введение в моделирование Моделирование представляет собой один из фундаментальных методов научного познания, который позволяет изучать объекты и явления через создание их упрощенных аналогов. В. . .
Алгоритмы и исполнители
hw_wired 28.01.2025
Введение в алгоритмы В современном мире информационных технологий алгоритмы играют основополагающую роль в решении различных задач и автоматизации процессов. Алгоритм представляет собой точную. . .
Хранение информации
hw_wired 28.01.2025
Введение: Роль систем хранения информации в современном мире В современную эпоху цифровых технологий эффективное хранение информации становится одним из ключевых факторов успешного развития любой. . .
Обработка числовой информации
hw_wired 28.01.2025
Введение в обработку числовой информации В современном мире обработка числовой информации стала неотъемлемой частью как профессиональной деятельности, так и повседневной жизни. Электронные таблицы. . .
Мультимедиа
hw_wired 28.01.2025
Введение в мультимедийные технологии В современном мире мультимедийные технологии стали неотъемлемой частью нашей жизни, проникнув во все сферы человеческой деятельности. Термин "мультимедиа". . .
Обработка текстовой информации
hw_wired 28.01.2025
Введение в обработку текстовой информации В современном мире обработка текстовой информации играет фундаментальную роль в различных сферах человеческой деятельности. Текстовые редакторы стали. . .
Обработка графической информации
hw_wired 28.01.2025
Введение в компьютерную графику Компьютерная графика стала неотъемлемой частью современного цифрового мира, пройдя впечатляющий путь развития от простейших черно-белых изображений до сложных. . .
Python в Алгоритмике: Решение задач
hw_wired 28.01.2025
Введение в Python и Алгоритмику В современном мире программирование стало неотъемлемой частью образования и профессионального развития. Python зарекомендовал себя как один из самых популярных и. . .
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru