С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 15
1

Клиент-сервер

21.03.2013, 09:11. Показов 2524. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток. У меня возникла следующая проблема. Я не могу отправить текст из textbox клиента в textbox сервера... Точнее не могу сообразить как это сделать. Сервер запускается и работает, клиент к нему подключается, а вот с отправкой ни как, точнее текст уходит, и в обратную сторону мне приходит сколько символов отправилось, но на сервере это нигде не появляется.

Клиент:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    
    public partial class client : Form, WindowsFormsApplication1.Iclient
    {
        Socket clienth = null;
        //Socket srv = null;
        public client()
        {
            InitializeComponent();
        }
 
        private void connect_Click(object sender, EventArgs e)
        {
            if (clienth != null && clienth.Connected)
                clienth.Disconnect(false);
            IPAddress addr = GetAddress(serveraddr.Text);
            if (addr == null)
            {
                MessageBox.Show("Не могу разобрать адрес");
                return;
            }
            clienth = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            EndPoint point = new IPEndPoint(addr, 40002);
            try
            {
                clienth.Connect(point);
                richTextBox1.AppendText("Соединение установлено..." + "\n");
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ошибка соединения: " + exc.Message);
            }
        }
 
        public IPAddress GetAddress(string address)
        {
            IPAddress ipAddress = null;
            try
            {
                ipAddress = IPAddress.Parse(address);
            }
            catch (Exception)
            {
                IPHostEntry heserver;
                try
                {
                    heserver = Dns.GetHostEntry(address);
                    if (heserver.AddressList.Length == 0)
                    {
                        return null;
                    }
                    ipAddress = heserver.AddressList[0];
                }
                catch
                {
                    return null;
                }
            }
            return ipAddress;
         }
 
        private void send_Click(object sender, EventArgs e)
        {
           if (clienth == null || !clienth.Connected)
            {
                MessageBox.Show("Сначала подключитесь к серверу");
                return;
            }
            clienth.Send(Encoding.ASCII.GetBytes(usdbuy.Text));
            //clienth.Send(Encoding.ASCII.GetBytes(usdsell.Text));
            //clienth.Send(Encoding.ASCII.GetBytes(eurobuy.Text));
            //clienth.Send(Encoding.ASCII.GetBytes(eurosell.Text));
            //clienth.Send(Encoding.ASCII.GetBytes(jpybuy.Text));
            //clienth.Send(Encoding.ASCII.GetBytes(jpysell.Text));
            //clienth.Send(Encoding.ASCII.GetBytes(yuanbuy.Text));
            //clienth.Send(Encoding.ASCII.GetBytes(yuansell.Text));
 
            byte[] buffer = new byte[1024];
            int bytes = clienth.Receive(buffer);
            if (bytes > 0)
            {
                string s = Encoding.UTF8.GetString(buffer, 0, bytes);
                richTextBox1.AppendText(s + "\n");
            }
        }
 
    }
}
Сервер:
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.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class server : Form
    {
        Socket srv = null;
        public server()
        {
            InitializeComponent();
            
        }
 
        private void server_Activated(object sender, EventArgs e)
        {
            if (srv != null && srv.Connected)
                srv.Disconnect(false);
            srv = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            EndPoint endPoint = new IPEndPoint(IPAddress.Any, 40002);
 
            try
            {
                srv.Bind(endPoint);
                srv.Listen(100);
            }
 
            catch (Exception exc)
            {
                MessageBox.Show("Невозможно запустить сервер" + exc.Message);
                return;
            }
 
            srv.BeginAccept(new AsyncCallback(AsyncAcceptCallback), srv);
        }
 
        void AsyncAcceptCallback(IAsyncResult result)
        {
            Socket serverSocket = (Socket)result.AsyncState;
            SocketData data = new SocketData();
            data.ClientConnection = serverSocket.EndAccept(result);
            data.ClientConnection.BeginReceive(data.Buffer, 0, 1024, SocketFlags.None, new AsyncCallback(ReadCallBack), data);
        
        }
 
        void ReadCallBack(IAsyncResult result)
        {
           SocketData data = (SocketData)result.AsyncState;
            int bytes = data.ClientConnection.EndReceive(result);
            if (bytes > 0)
            {
                string s = Encoding.UTF8.GetString(data.Buffer, 0, bytes);
                data.ClientConnection.Send(Encoding.UTF8.GetBytes("Данные отправлены на сервер, в колличестве: " + s.Length + " символов"));
                
            }
        }
 
    }
}
SocketData буфер:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
 
namespace WindowsFormsApplication1
{
    class SocketData
    {
        public const int BufferSize = 1024;
        public Socket ClientConnection { get; set; }
        byte[] buffer = new byte[BufferSize];
 
        public byte[] Buffer
        {
            get { return buffer; }
            set { buffer = value; }
 
        }
    }
}
Буду очень благодарна за помощь...

Пробовала так:
C#
1
srv.Receive(Encoding.UTF8.GetBytes(usdbuy.Text));
не получается...

Добавлено через 4 часа 52 минуты
Я так понимаю это можно сделать через BeginReceive, но не могу сообразить как...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2013, 09:11
Ответы с готовыми решениями:

Клиент-сервер: Как определить, что клиент отключился?
Привет. Есть клиент и сервер, при подключении клиента, на сервере создается класс, который содержит...

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

Клиент-сервер. Клиент не принимает данные
Здравствуйте о светлейшие умы сего мира! Я работаю над одним проектом, а именно написание...

Клиент-Сервер. Удалённый сервер
Всем здравствуйте. Я заинтересовался написать клиент-сервер приложение. Написал я отдельную...

20
4 / 4 / 1
Регистрация: 31.05.2011
Сообщений: 52
22.03.2013, 01:25 2
Интересно. Вы хотите увидеть то, что не выводите нигде. В этом методе на сервере должен быть реализован функционал вывода отправленной информации=)
C#
1
2
3
4
5
6
7
8
9
10
11
        void ReadCallBack(IAsyncResult result)
        {
           SocketData data = (SocketData)result.AsyncState;
            int bytes = data.ClientConnection.EndReceive(result);
            if (bytes > 0)
            {
                string s = Encoding.UTF8.GetString(data.Buffer, 0, bytes);
                data.ClientConnection.Send(Encoding.UTF8.GetBytes("Данные отправлены на сервер, в колличестве: " + s.Length + " символов"));
                
            }
        }
но я его здесь не вижу. Вы говорите что видите сколько символов отправлено, ну так и правильно. В этой строке
C#
1
                data.ClientConnection.Send(Encoding.UTF8.GetBytes("Данные отправлены на сервер, в колличестве: " + s.Length + " символов"));
Вы выводите количество принятых на сервере символов.
Посмотрите здесь как получать принятые через сокет данные
http://msdn.microsoft.com/ru-r... ocket.aspx
0
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 15
22.03.2013, 05:57  [ТС] 3
Это и так понятно, вопрос был в том как реализовать вывод отправленного сообщения... Собственно я понимаю, что оно должно приниматься через
C#
1
srv.BeginReceive()
, но не могу правильно написать эту строку...

Добавлено через 2 часа 54 минуты
Еще пробывала так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
void ReadCallBack(IAsyncResult result)
        {
           SocketData data = (SocketData)result.AsyncState;
            int bytes = data.ClientConnection.EndReceive(result);
            if (bytes > 0)
            {
                string s = Encoding.UTF8.GetString(data.Buffer, 0, bytes);
                data.ClientConnection.Send(Encoding.UTF8.GetBytes("Данные отправлены на сервер, в колличестве: " + s.Length + " символов"));
 
                data.ClientConnection.Receive(Encoding.UTF8.GetBytes(usdbuy.text));
            }
        }
Но при таком раскладе, на сервере в textbox usdbuy ничего не вставляется, а клиент вообще виснет при отправке сообщения.
0
4 / 4 / 1
Регистрация: 31.05.2011
Сообщений: 52
22.03.2013, 17:22 4
Попробуйте так:
C#
1
2
3
4
5
6
7
8
9
10
void ReadCallBack(IAsyncResult result)
        {
           SocketData data = (SocketData)result.AsyncState;
            int bytes = data.ClientConnection.EndReceive(result);
            if (bytes > 0)
            {
                string s = Encoding.UTF8.GetString(data.Buffer, 0, bytes);
                data.ClientConnection.Send(Encoding.UTF8.GetBytes("Данные отправлены на сервер, в колличестве: " + s.Length + " символов. Отправленная строка \""+s+"\""));
            }
        }
Я не самый крутой гугу сокетов. И сейчас сам только первое приложение пишу. Но если вы можете определить количество отправленных символов вот так
C#
1
s.Length
то скорее всего сами отправленные символы находятся в переменной
C#
1
string s;
Ее вы и выводите=)

Добавлено через 4 минуты
И я советую вам разобрать пример который представлен на странице http://msdn.microsoft.com/ru-r... ocket.aspx. Там есть хороший пример реализации отправки и приема большого количества байтов. от вашего отличается тем, что прием осуществляется в цикле.
0
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 15
22.03.2013, 18:01  [ТС] 5
Дело в том, что когда я вывожу эту переменную:

usdbuy.text = s;

Отправка происходит, но VS при этом ругается, сейчас точно не помню ошибку, вроде что то связанно с использованием переменной не из того места откуда она была вызвана.
Завтра напишу поточнее, а то уже спать легла. И еще при таком раскладе у меня клиент после повторной отправки зависает... Т.е. в конструкторе приложение выдает ошибку, а откомпиленное приложение виснет после повторной отправки...

пс, я сама пишу свое первое приложение на C# .net поэтому тоже еще многого не знаю а написать очень надо, сроки поджимают...
0
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,964
22.03.2013, 18:43 6
с использованием переменной не из того места откуда она была вызвана.
Control.Invoke method - его используйте.
мм, Бот, торгующий на бирже? Или просто парсите сайт с курсом валют?
0
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 15
22.03.2013, 18:54  [ТС] 7
Спасибо, завтра поверю.
Нет, все намного проще. Табло с курсами валют. Чтобы тети из касы могли менять курсы валют на экран телевизора
0
4 / 4 / 1
Регистрация: 31.05.2011
Сообщений: 52
22.03.2013, 19:16 8
4ukca, так с этой ошибки и нужно было начинать=)
Верно подсказывают, нужно выводить через вот такой код
C#
1
usdbuy.Invoke(new Action<string>((kurs) => usdbuy.Text = kurs), s);
Больше про это написано в тветы на 7 самых частых вопросов по WinForms
1
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 15
23.03.2013, 16:18  [ТС] 9
Ошибка про invoke исчезла, но клиент по прежнему висит после повторной отправки... Я даже сделала разрыз соединения после отправки, потом заного подключаюсь, снова отправляю данные, и клиент повисает Есть какие нибудь мысли по этому поводу?

ПС: Зависает в клиенте на этой строке: int bytes = clienth.Receive(buffer);
А при перезапуске клиента, но без перезагрузки сервера, на сервер тоже уже ничего не приходит, пока не перезагрузишь сам сервер.

Добавлено через 2 минуты
ПС2: Сейчас еще проверила, не закрывая клиент, но перезапустив сервер повторная отправка получилась, соотвественно проблема гдето в серверной части.

Добавлено через 4 минуты
Вопрос тогда в следующем, как можно после получения данных перезапустить сервер?

Добавлено через 1 минуту
т.е. как мне снова сделать, чтобы сработала строка private void server_Activated(object sender, EventArgs e)
0
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,964
23.03.2013, 17:08 10
Цитата Сообщение от 4ukca Посмотреть сообщение
srv.BeginAccept(new AsyncCallback(AsyncAcceptCallback), srv);
Нужно в вечный цикл. Должен ведь слушать постоянно, а не один раз принять соединение при активации.

Добавлено через 11 минут
Да и вообще прослушку надо в отдельный поток, иначе GUI просто подвиснет. Мм, хотя нет, у вас и так асинхронно.
0
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 15
24.03.2013, 03:45  [ТС] 11
Чего то я не поняла вашего ответа Можно поподробней?
0
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,964
24.03.2013, 09:38 12
сервер должен слушать постоянно. А у вас принимать только одно соединение и то во время активации.
C#
1
2
while(true)
 srv.BeginAccept(new AsyncCallback(AsyncAcceptCallback), srv);
0
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 15
24.03.2013, 14:44  [ТС] 13
Цитата Сообщение от IamRain Посмотреть сообщение
сервер должен слушать постоянно. А у вас принимать только одно соединение и то во время активации.
C#
1
2
while(true)
 srv.BeginAccept(new AsyncCallback(AsyncAcceptCallback), srv);
Таким вот образом, сервер вообще не запускается, форма тупо черная и сервер висит
0
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,964
24.03.2013, 14:52 14
Тогда слегка поменять арх-ру. Написать метод, который начинать слушать соединения. Запустить его в другом потоке, через Thread class, for example. Запустить уже синхронно. То есть весь код Socket.Bind(), Socket.Listen() в отдельный метод.

Добавлено через 2 минуты
".NET - Сетевое программирование для профессионалов."
1
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 15
24.03.2013, 14:57  [ТС] 15
Сейчас скачаю, почитаем Может чего получится...
0
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,964
24.03.2013, 15:04 16
Глава 4, стр. 116 - SocketServer.cs
Вот этот код в отдельный поток засунуть.

Добавлено через 6 минут
Привязку к endPoint можно в основном потоке оставить.
А вот Listen() and Accept() в другой кинуть.
0
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 15
25.03.2013, 02:38  [ТС] 17
Уф, с этим я разобралась, просто у меня после получения данных была команда EndAccept и сервер переставал слушать входящие сообщения Просто заново запустила прослушку и все стало ок
Теперь у меня другая проблемка...

До этого момента я отправляла текст с одного textbox`а, сейчас мне нужно отправить 8. Но все они запишутся в один буфер. Как мне на сервере разбить буфер и раскидать все по разным textbox`ам?
0
17 / 11 / 3
Регистрация: 25.02.2013
Сообщений: 48
25.03.2013, 06:20 18
Используйте какой нибудь символ в качестве разделителя.
0
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 15
25.03.2013, 09:06  [ТС] 19
А можно ли сделать так, например с 1 по 5й символ в один текстбокс, с 5-по 10 во второй и т.д.?
0
17 / 11 / 3
Регистрация: 25.02.2013
Сообщений: 48
25.03.2013, 09:08 20
А если будет больше 5 ти символов, тогда программа будет работать неправильно.
0
25.03.2013, 09:08
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.03.2013, 09:08
Помогаю со студенческими работами здесь

Клиент и сервер
Здравствуйте, помогите пожалуйста!Есть клиент и сервер,которые взаимодействуют между собой.Клиент...

Клиент-сервер
Доброй ночи ув. программисты. Возникла следующая проблема: есть клиент-серверное приложение для...

Сервер-клиент
При включении клиент определяет и отправляет на сервер совой IP-адресс. Проблема в том, что сервер...

Клиент - сервер
TCP клиент-сервер. Не получаю ответа от сервера. Сервер прикрепил внизу. Клиент вот: using...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru