Асинхронный сокет синхронизация потоков - C#
Формулировка задачи:
Нужно сделать синхронизацию каталогов на сервере и на клиенте используя неблокирующий сокет.
Использую асинхронный.
На сервере и на клиенте получаю имена файлов.
На клиенте по одному названию файла начинаю передавать на сервер.
Если пришёл отрицательный ответ, мы отправляем файл на сервер, если ответ положительный мы отправляем название следующего файла.
Проблема состоит в том что ответ на клиент приходит не на тот файл который мы послали, иногда вообще ответ не приходит. В чём дело?
Сервер:
Клиент:
//обрабатываем принятые названия while (true) { try { state.workSocket.BeginReceive(state.buffer, 0, StateObject.bufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallBackFile), state); if (state.sb == "end!") { break; } for (int i = 0; i < fileInfo.Length; i++) { if (fileInfo[i].Name.ToString() == state.sb) { Send("Yes"); Console.WriteLine("Есть: " + fileInfo[i].Name); }else if (i == fileInfo.Length - 1) { Send("No"); Console.WriteLine("Нету: " + fileInfo[i].Name); } } Thread.Sleep(50); } catch (Exception) { break; } } private void ReceiveCallBackFile(IAsyncResult ar) { byte[] buffer = new byte[1]; try { StateObject state = ar.AsyncState as StateObject; Socket handler = state.workSocket; if (handler.Connected) { int bytes = handler.EndReceive(ar); if (bytes > 0) { state.sb = Encoding.UTF8.GetString(state.buffer, 0, bytes); // Console.WriteLine(state.sb); } } } catch (Exception e) { Console.WriteLine(e.Message); } } //отправляем ответ private void Send(string msg) { byte[] buffer = Encoding.UTF8.GetBytes(msg); this.client_socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), this.client_socket); } private void SendCallBack(IAsyncResult ar) { Socket handle = ar.AsyncState as Socket; handle.EndSend(ar); }
FileInfo[] fileInf = synchornization.DirectoryInf(); foreach (FileInfo fri in fileInf) { Client.Send(fri.Name.ToString()); //Thread.Sleep(50); Client.Receive(state); Console.WriteLine(fri.Name.ToString() + ": " + state.sb); state.sb = null; Thread.Sleep(50); } Client.Send("end!"); public void Send(string message) { byte[] buffer = Encoding.UTF8.GetBytes(message); this.client_socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), this.client_socket); } private void SendCallBack(IAsyncResult ar) { Socket handler = ar.AsyncState as Socket; handler.EndSend(ar); } public void Receive(StateObject state) { state.workSocket = this.client_socket; state.workSocket.BeginReceive(state.buffer, 0, StateObject.bufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallBack), state); } private void ReceiveCallBack(IAsyncResult ar) { try { string cmd = String.Empty; StateObject state = ar.AsyncState as StateObject; Socket handler = state.workSocket; if (handler.Connected) { int bytes = handler.EndReceive(ar); if (bytes > 0) { state.sb = Encoding.UTF8.GetString(state.buffer, 0, bytes); if (state.sb != null) { //....обработка принятых данных // Console.WriteLine(state.sb); } // else // handler.BeginReceive(state.buffer, 0, StateObject.bufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallBack), state); } } } catch (Exception) { } }
Решение задачи: «Асинхронный сокет синхронизация потоков»
textual
Листинг программы
int bytes = handler.EndReceive(ar); Console.WriteLine(bytes); Console.WriteLine(Encoding.UTF8.GetString(state.buffer, 0, bytes));
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д