Данные от сервера клиенту передаются только один раз - C#
Формулировка задачи:
Я хочу постоянно передавать от сервера клиенту массив байт, но получается передать только 1 раз. Никак не пойму почему.
Сервер:
Клиент:
Учитывать надо, что одновременных клиентов может быть несколько. Проблема в том, что на 2ой итерации Сервер ждет на "BeginAccept/EndAccept", а клиент на "BeginReceive/EndReceive". Т.е получается, что клиент готов получать, а сервер не знает об этом. Подскажите как решить проблему.
Интересный факт: Если запустить сервер, затем клиент, то передастся массив 1 раз. Но если(ничего не закрываяя) открыть новый экземпляр клиента и выполнить его, то первый экземпляр пример 2ой раз массив. Если 2ой экземпляр клиента выполнить ещё раз, то первый примет 3ий массив. И так далее
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; } }
Решение задачи: «Данные от сервера клиенту передаются только один раз»
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(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д