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

Данные от сервера клиенту передаются только один раз

06.05.2014, 03:44. Показов 1003. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я хочу постоянно передавать от сервера клиенту массив байт, но получается передать только 1 раз. Никак не пойму почему.
Сервер:
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
public ServerSocket(IPAddress ipAddress, int port)
        {
            _clients = new List<ClientModel>();
 
            _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _server.Bind(new IPEndPoint(ipAddress, port));
            _server.Listen(20); 
            Accept();
        }
 
        private async void Accept()
        {
            
            for ( int i=0;i<10 ;i++)
            {
                var socket = await Task.Factory.FromAsync<Socket>(_server.BeginAccept, _server.EndAccept, true);
                var newClient = new ClientModel
                {
                    Id = _id++,
                    ClientSocket = socket
                };
                _clients.Add(newClient);
                await Send(1, "hello " + i + "");
            }
        }
public async Task Send(int id, String data)
        {
            var client = _clients.FirstOrDefault(cl => cl.Id == id);
            if(client == null) return;
 
            var byteData = Encoding.UTF8.GetBytes(data);
            await Task.Factory.FromAsync<int>(
              client.ClientSocket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, null, client.ClientSocket),
              client.ClientSocket.EndSend);
        }
Клиент:
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
public ClientSocket()
        {
            _client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }
 
        public bool Connect(IPAddress ipAddress, int port)
        {
            _client.Connect(ipAddress, port);
            if (!_client.Connected)
            {
                return false;
            }
            Receive();
            return true;
        }
 
private async void Receive()
        {
            var buffer = new byte[4096];
            for (; ; )
            {
                try
                {
                    var bytesRead = await Task.Factory.FromAsync<int>(
                            _client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, null, _client),
                             _client.EndReceive);
                    if (bytesRead <= 0) continue;
 
                    var message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                    Console.WriteLine(message);
                }
                catch
                {
                    break;
                }
            }
Учитывать надо, что одновременных клиентов может быть несколько. Проблема в том, что на 2ой итерации Сервер ждет на "BeginAccept/EndAccept", а клиент на "BeginReceive/EndReceive". Т.е получается, что клиент готов получать, а сервер не знает об этом. Подскажите как решить проблему.
Интересный факт: Если запустить сервер, затем клиент, то передастся массив 1 раз. Но если(ничего не закрываяя) открыть новый экземпляр клиента и выполнить его, то первый экземпляр пример 2ой раз массив. Если 2ой экземпляр клиента выполнить ещё раз, то первый примет 3ий массив. И так далее
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2014, 03:44
Ответы с готовыми решениями:

Работа с Indy TCP. Данные передаются только один раз
Делаю обмен данными между компами в локальной сети. Использую Indy TCP. Коннект устанавливается....

В базу mysql данные заносятся только один раз, не знаю в чём дело
//reg.php &lt;?php include ('connect.php'); $name=$_POST; $sname=$_POST; $data_d=$_POST;...

Как передать данные от сервера клиенту?
Существует серверное C# приложение, и клиентское. Необходимо, чтобы сервер передавал данные...

В Debug режиме в VS-2012 данные передаются нормально, но при запуске без дебага возникают ошибки и данные не передаются
Всем доброе время суток. Есть проект, работающий на ASP.NET MVC с использованием Entity Framework....

5
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
06.05.2014, 10:27 2
Цитата Сообщение от 123456789igor2 Посмотреть сообщение
Интересный факт: Если запустить сервер, затем клиент, то передастся массив 1 раз. Но если(ничего не закрываяя) открыть новый экземпляр клиента и выполнить его, то первый экземпляр пример 2ой раз массив. Если 2ой экземпляр клиента выполнить ещё раз, то первый примет 3ий массив. И так далее
C#
1
2
3
4
5
6
7
8
9
10
11
 for ( int i=0;i<10 ;i++)
            {
                var socket = await Task.Factory.FromAsync<Socket>(_server.BeginAccept, _server.EndAccept, true);
                var newClient = new ClientModel
                {
                    Id = _id++,
                    ClientSocket = socket
                };
                _clients.Add(newClient);
                await Send(1, "hello " + i + ""); // по кто подключился шлем данные клиенту с ID=1
            }
Добавлено через 6 минут
Цитата Сообщение от 123456789igor2 Посмотреть сообщение
Сервер ждет на "BeginAccept/EndAccept", а клиент на "BeginReceive/EndReceive". Т.е получается, что клиент готов получать, а сервер не знает об этом. Подскажите как решить проблему.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public async Task Send(int id, String data)
        {
            var client = _clients.FirstOrDefault(cl => cl.Id == id);
            if(client == null) return;
 
            var byteData = Encoding.UTF8.GetBytes(data);
            await Task.Factory.FromAsync<int>(
              client.ClientSocket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, null, client.ClientSocket),
              client.ClientSocket.EndSend);
 
            // попробуй так
            await Send(ID,"hello " + "hello " + i + "");        
           //
}
0
1 / 1 / 0
Регистрация: 13.09.2013
Сообщений: 23
06.05.2014, 16:09  [ТС] 3
EVG-1980, Таким образом только 1 клиент может подключиться. Выполнение не выйдет за пределы метода Send. Но 1 клиент может непрерывно получать, таким способом, но только 1

Добавлено через 36 минут
Думаю просто не хватает каких то колбэков что бы снова связать клиент и сервер. Но каких не могу понять
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
06.05.2014, 16:31 4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private async void Accept()
        {
            
            for ( int i=0;i<10 ;i++)
            {
                var socket = await Task.Factory.FromAsync<Socket>(_server.BeginAccept, _server.EndAccept, true);
                var newClient = new ClientModel
                {
                    Id = _id++,
                    ClientSocket = socket
                };
                _clients.Add(newClient);
                await Send(Id, "hello " + i + "");
            }
           await Accept();
        }
0
1 / 1 / 0
Регистрация: 13.09.2013
Сообщений: 23
06.05.2014, 16:46  [ТС] 5
Тоже не работает. Перезапуск "Accept" будет работать только если постоянно клиент после каждый итерации будет делать реконнект
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
06.05.2014, 16:58 6
123456789igor2,

Использование ContinueWith для функции обратного вызова

Если требуется доступ к данным файла, в отличие от числа байтов, метода FromAsync недостаточно. Вместо этого используйте Task, свойство которого Result содержит данные файла. Это можно сделать, добавив продолжение в исходную задачу. Продолжение выполняет работу, которая обычно выполняется делегатом AsyncCallback. Оно вызывается по завершении предшествующей задачи, и буфер данных заполняется. (Объект FileStream необходимо закрыть перед возвратом.)

Добавлено через 7 минут
Взято отсюда http://msdn.microsoft.com/ru-r... 10%29.aspx , там пример с файлом но суть не меняется
0
06.05.2014, 16:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2014, 16:58
Помогаю со студенческими работами здесь

Можно ли динамически отправлять данные с сервера клиенту на серверных скриптах?
Помогите пожалуйста! Можно ли динамически отправлять данные с сервера клиенту на серверных...

Программа не компилируется (не запускается) во второй раз (то есть только один раз)
почему у меня всего лишь один раз могу запустить программу через команду Run, когда хочу еще раз...

Вывести только те символы, которые встречаются в тексте только один раз
Из заданного текста предложения выберите и выведите на экран только те символы, которые встречаются...

Напечатать только те символы строки, которые встречаются в ней только один раз
Напечатать только те символы строки которые встречаются в ней только один раз.


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru