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

Узнай цену своей работы

Формулировка задачи:

Я хочу постоянно передавать от сервера клиенту массив байт, но получается передать только 1 раз. Никак не пойму почему. Сервер:
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);
        }
Клиент:
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ий массив. И так далее

Решение задачи: «Данные от сервера клиенту передаются только один раз»

textual
Листинг программы
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();
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5
Похожие ответы