Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
3 / 3 / 2
Регистрация: 27.09.2009
Сообщений: 200

Неправильная работа клиент серверного приложения

07.09.2013, 22:21. Показов 1631. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашел в msdn исходники простых клиента и сервера, скомпилил в качестве консольных приложений - все работает, решил немного переделать для winforms и в результате столкнулся с проблемой автоматического завершения программ. Подскажите в чем проблема? Сам грешу на то что методы нестатические....
Код клиента
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
107
108
109
110
111
112
113
114
namespace Client
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public class StateObject
        {
            public Socket WorkSocket = null;
            public const int buffersize = 512;
            public byte[] Buffer = new byte[buffersize];
            public StringBuilder sb = new StringBuilder();
        }
        
        public int port = 11000;
        public ManualResetEvent ConnectDone = new ManualResetEvent(false);
        public ManualResetEvent SendDone = new ManualResetEvent(false);
        public ManualResetEvent RecieveDone = new ManualResetEvent(false);
        public string response = string.Empty;
        public void StartClient()
        {
            IPHostEntry HostEntry = Dns.Resolve(Dns.GetHostName());
            IPAddress IpAddres = HostEntry.AddressList[0];
            IPEndPoint RemoteIp = new IPEndPoint(IpAddres,port);
            Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Server.BeginConnect(RemoteIp, new AsyncCallback(ConnectCallback), Server);
            ConnectDone.WaitOne();
            Send(Server,"Test message <EOF>");
            SendDone.WaitOne();
            Recieve(Server);
            RecieveDone.WaitOne();
            textBox2.Text += "\nResponse recieved {0}" + response;
            Server.Shutdown(SocketShutdown.Both);
            Server.Close();
        }
        private void ConnectCallback(IAsyncResult ar)
        {
            try
            {
                Socket client = (Socket)ar.AsyncState;
                client.EndConnect(ar);
                textBox2.Text += "\nSocket connected to " + client.RemoteEndPoint.ToString();
                ConnectDone.Set();
            }
            catch (Exception ex)
            {
                textBox2.Text = "\n" + ex.Message;
            }
 
        }
        private void Recieve(Socket Client)
        {
            try
            {
                StateObject so = new StateObject();
                so.WorkSocket = Client;
                Client.BeginReceive(so.Buffer, 0, StateObject.buffersize, 0, new AsyncCallback(ReceiveCallback), so);
            }
            catch (Exception ex)
            {
                textBox2.Text += "\n" + ex.Message;
            }
        }
        private void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                StateObject so = (StateObject)ar.AsyncState;
                Socket Client = so.WorkSocket;
                int bytesRead = Client.EndReceive(ar);
                if (bytesRead > 0)
                {
                    so.sb.Append(Encoding.ASCII.GetString(so.Buffer,0,bytesRead));
                    Client.BeginReceive(so.Buffer,0,StateObject.buffersize,0,new AsyncCallback(ReceiveCallback), so);
                }
                else if (so.sb.Length > 1)
                {
                    response = so.sb.ToString();
                }
                RecieveDone.Set();
            }
            catch(Exception ex)
            {
                textBox2.Text += "\n" + ex.Message;
            }
        }
        private void Send(Socket Client, string message)
        {
            byte[] data = Encoding.ASCII.GetBytes(message);
            Client.BeginSend(data, 0, data.Length, 0, new AsyncCallback(SendCallback), Client);
        }
        private void SendCallback(IAsyncResult ar)
        {
            try
            {
                Socket Client = (Socket)ar.AsyncState;
                int byteSend = Client.EndSend(ar);
                textBox2.Text += "\nSend " + byteSend.ToString() + " bytes to server";
                SendDone.Set();
            }
            catch (Exception ex)
            {
                textBox2.Text += "\n" + ex.Message;
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            StartClient();
        }
    }
}
Код сервера
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
namespace Server
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public class StateObject
        {
            public Socket WorkSocket = null;
            public const int buffersize = 1024;
            public byte[] Buffer = new byte[buffersize];
            public StringBuilder sb = new StringBuilder();
        }
        public ManualResetEvent allDone = new ManualResetEvent(false);
        public void StartListener()
        {
            IPHostEntry HostEntry = Dns.Resolve(Dns.GetHostName());
            IPAddress IpAddres = HostEntry.AddressList[0];
            IPEndPoint LocalPoint = new IPEndPoint(IpAddres, 11000);
            Socket Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                Listener.Bind(LocalPoint);
                Listener.Listen(10);
                while (true)
                {
                    allDone.Reset();
                    textBox2.Text += "\nWaiting for a connection...";
                    Listener.BeginAccept(new AsyncCallback(AcceptCallback), Listener);
                    allDone.WaitOne();
                }
            }
            catch (Exception ex)
            {
                textBox2.Text += "\n" + ex.Message;
            }
        }
        private void AcceptCallback(IAsyncResult ar)
        {
            allDone.Set();
            Socket listener = (Socket)ar.AsyncState;
            Socket handler = listener.EndAccept(ar);
            StateObject so = new StateObject();
            so.WorkSocket = handler;
            handler.BeginReceive(so.Buffer, 0, StateObject.buffersize, 0, new AsyncCallback(ReceiveCallback), so);
        }
        private void ReceiveCallback(IAsyncResult ar)
        {
            string content = string.Empty;
            StateObject so = (StateObject)ar.AsyncState;
            Socket handler = so.WorkSocket;
            int bytesRead = handler.EndReceive(ar);
            if (bytesRead > 0)
            {
                so.sb.Append(Encoding.ASCII.GetString(so.Buffer, 0, bytesRead));
                content = so.sb.ToString();
                if (content.IndexOf("<EOF>") > -1)
                {
                    textBox2.Text += "\nRead " + content.Length + " bytes from " + content;
                    Send(handler, content);
                }
                else
                {
                    handler.BeginReceive(so.Buffer, 0, StateObject.buffersize, 0, new AsyncCallback(ReceiveCallback), so);
                }
            }
        }
        private void Send(Socket client, string message)
        {
            byte[] SendBytes = Encoding.ASCII.GetBytes(message);
            client.BeginSend(SendBytes, 0, SendBytes.Length, 0, new AsyncCallback(SendCallback), client);
        }
        private void SendCallback(IAsyncResult ar)
        {
            try
            {
                Socket client = (Socket)ar.AsyncState;
                int sendBytes = client.EndSend(ar);
                textBox2.Text += "\nSend " + sendBytes + " to client";
                client.Shutdown(SocketShutdown.Both);
                client.Close();
            }
            catch (Exception ex)
            {
                textBox2.Text += "\n" + ex.Message;
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            StartListener();
        }
    }
}
Судя по отчетам сервер вылетает где то в районе передачи данных клиенту
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.09.2013, 22:21
Ответы с готовыми решениями:

Создание клиент-серверного приложения на C#.NET
Руководство поставило задачу создать программу типа &quot;клиент-сервер&quot;, которая быстро инсталлируется на любой компьютер и не требует...

подскажите с реализацией клиент - серверного приложения
Здравствуйте! Подскажите. Необходимо написать подобного рода программу(клиент серверное приложение). Вот простой пример. 1. Клиент...

Нюансы организации клиент-серверного приложения
Всем привет! Ребята помогите определится с выбором, практического опыта не много, необходимо организовать серверную часть - БД ms sql и до...

10
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
07.09.2013, 22:38
А что конкретно происходит?
0
3 / 3 / 2
Регистрация: 27.09.2009
Сообщений: 200
08.09.2013, 12:24  [ТС]
Конкретно Сервер начинает прослушку порта, клиент отправляет ему сообщение, однако сервер его не обрабатывает, и в свою очередь посылает сообщение клиенту,после чего зависает, а клиент фиксирует разрыв соединения
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
08.09.2013, 12:31
Посмотрите в отладке ReceiveCallback что он там принимает и как обрабатывает.
0
3 / 3 / 2
Регистрация: 27.09.2009
Сообщений: 200
08.09.2013, 12:34  [ТС]
Судя по отладке сервер вылетает в этом месте :
C#
1
textBox2.Text += "\nRead " + content.Length.ToString() + " bytes from " + content;
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
08.09.2013, 12:39
Описание исключения дословно бы.
0
3 / 3 / 2
Регистрация: 27.09.2009
Сообщений: 200
08.09.2013, 12:44  [ТС]
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'textBox2' не из того потока, в котором он был создан.
Ух ты не знал что так нельзя, что же тогда записывать сообщение в переменную и после завершения чтения/отправки писать их в textBox? только так?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
08.09.2013, 12:57
Вот так сделайте.
C#
1
2
textBox2.Invoke(new Action(()=>{
textBox2.Text += "\nRead " + content.Length.ToString() + " bytes from " + content;}));
И почитайте про обращение к элементам управления из других потоков.
1
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
08.09.2013, 13:00
Используйте Dispatcher

C#
1
2
3
4
5
6
7
public partial class Form1 : Form
    {
        Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
        public Form1()
        {
            InitializeComponent();
        }
C#
1
dispatcher.BeginInvoke(new Action<string>(setText)("\nRead " + content.Length.ToString() + " bytes from " + content));
C#
1
2
3
4
private static void setText(string obj)
        {
            textBox2.Text += obj;
        }
1
3 / 3 / 2
Регистрация: 27.09.2009
Сообщений: 200
08.09.2013, 15:35  [ТС]
Почему то все равно не выходит , теперь выпадает исключение crossthreadmessagingexception
C#
1
2
3
4
5
6
7
8
9
10
11
12
string mes = "\nRead " + content.Length.ToString() + " bytes from " + handler.LocalEndPoint.ToString();
                    SendSafeText(mes);
                    Send(handler, content);
private void SendSafeText(string text)
        {
            if (textBox2.InvokeRequired)
                textBox2.Invoke(new Action<string>((s) => textBox2.Text += s), text);
            else
            {
                textBox2.Text += text;
            }
        }
Добавлено через 46 секунд
Цитата Сообщение от Grishaco Посмотреть сообщение
Используйте Dispatcher
сейчас попробую

Добавлено через 3 минуты
а нет все работает, надо было использовать begininvoke вместо invoke

Добавлено через 1 час 31 минуту
Хм, как то странно работает теперь, клиент пишет что данные приняты, потом что состоялось подключение, и затем что была передача, сервер же вообще ничего кроме ожидания подключения не выводит
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
08.09.2013, 16:20
Цитата Сообщение от xam max Посмотреть сообщение
сервер же вообще ничего кроме ожидания подключения не выводит
Если вы получаете в клиенте сообщения, тогда самый простой вариант, поставить точку останова в сервере и посмотреть что там происходит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.09.2013, 16:20
Помогаю со студенческими работами здесь

TCP: организация клиент-серверного приложения
Подскажите, пожалуйста, как реализовать клиент-серверное приложение, которое: Клиент: 1 кнопка, при нажатии на неё отправляется запрос...

Каков принцип работы клиент-серверного приложения
Структура прилажения такая: Клиент весит и ждет пока сервер пришлет текст, сервер отсылает клиенту текст, клиент записывает текст в...

Найти ошибки в реализации клиент-серверного приложения
У меня клиент не работает как надо и с сервером проблемка Сервер using System; using System.Collections.Generic; using...

Как организовать работу клиент-серверного приложения через Интернет
Доброго времени суток. Сразу извиняюсь, если вопрос будет глупым. Пишется программа, что то в виде Скайпа Клиент: 1. Захват...

Как реализовать синхронизацию самовыделения сервера в одноранговой сети клиент-серверного приложения С#?
Имеется локальная сеть. При появлении клиента в ней, он должен проверить имеется ли сервер, с которым он может соединится, если да то он...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru