/// <summary> /// Отображает данные о пользователе в псевдоконсоль /// </summary> /// <param name="myPacket"></param> public void ShowData(MyClient.MyPacketWrapper myPacket) { this.Dispatcher.BeginInvoke (DispatcherPriority.Normal, (ThreadStart) delegate() { ConsoleTextBox.Text += "ФИО: " + myPacket.UserDetails.FullName + "\r\n"; ConsoleTextBox.Text += "Название учебного заведения: " + myPacket.UserDetails.University + "\r\n"; ConsoleTextBox.Text += "Номер телефона: " + myPacket.UserDetails.Phone + "\r\n"; } ); }
/// <summary> /// Сохраняем принятый бинарник /// </summary> /// <param name="myPacket">Объект, представляющий пакет с данными</param> /// <param name="clientNum">Номер клиента</param> public void SaveData(MyClient.MyPacketWrapper myPacket, int clientNum) { try { string path = baseDir + "Client" + clientNum; if (!Directory.Exists(path)) { //создаем дирректорию Directory.CreateDirectory(path); } string pathToFile = path + @"\" + myPacket.FileName; File.WriteAllBytes(pathToFile, myPacket.FileBuff); } catch (Exception exc) { MessageBox.Show(exc.Message); } }
/// <summary> /// Десериализуем наши принятые данные /// </summary> /// <param name="pathToFile">Путь к файлу</param> /// <returns>Объект, представляющий наш файл + информацию о пользователе</returns> public MyClient.MyPacketWrapper DeserializeData(string pathToFile) { byte[] buffer = File.ReadAllBytes(pathToFile); //можно делать проверку на количество доступной памяти MemoryStream ms = new MemoryStream(); // Записываем наши данные(buffer) в поток памяти ms.Write(buffer, 0, buffer.Length); BinaryFormatter serializer = new BinaryFormatter(); //получаем наш объект ms.Position = 0;//!! обязательно, чтобы корректно считать с начала MyClient.MyPacketWrapper myPacket = (MyClient.MyPacketWrapper)serializer.Deserialize(ms); ms.Close(); WriteStatus("Deserialization completed, size receive byte: " + buffer.Length); return(myPacket); }
/// <summary> /// Получает данные, записывает их в бинарный файл /// </summary> /// <param name="ar">Представляет состояние асинхронной операции</param> public void ReadCallback(IAsyncResult ar) { StateObject state = (StateObject)ar.AsyncState; Socket handler = state.workSocket; try//смотрим не пропала ли связть(с помощью handler.EndReceive - SocketException { int bytesRead = handler.EndReceive(ar); state.sizeReceived += bytesRead; if (bytesRead > 0) { string currentPath = baseDir + "Data" + state.clientNum + ".bin"; BinaryWriter writer = new BinaryWriter(File.Open(currentPath, FileMode.Append)); writer.Write(state.buffer, 0, bytesRead); writer.Close(); //Продолжаем принимать пока не совпадут размеры if (state.sizePacket != state.sizeReceived) { handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); } else { WriteStatus("File was received"); MyClient.MyPacketWrapper myPacket = DeserializeData(currentPath); SaveData(myPacket, state.clientNum); ShowData(myPacket); } } } catch (Exception exc) { MessageBox.Show("Пропала связь при приеме данных. Error: " + exc.Message); } }