Вот рабочий код! Здесь два варианта: получение массива байт картинки и сохранение ее на диск.
| Код | /// <summary> /// Метод асинхронно вызываемый при наличие данных в буферах приема. /// </summary> public void ReadCallback(IAsyncResult ar) {
TcpClientData myTcpClient = (TcpClientData)ar.AsyncState;
try { NetworkStream inputStream = myTcpClient.tcpClient.GetStream();
int read_byte = inputStream.EndRead(ar);
if (read_byte > 0) { // Из главного заголовка получим размер массива байтов информационного объекта string header = Encoding.Default.GetString(myTcpClient.buffer); int leninfo = int.Parse(header);
// Получим и десериализуем объект с подробной информацией о содержании получаемого сетевого пакета MemoryStream ms = new MemoryStream(leninfo); byte[] temp = new byte[leninfo]; read_byte = inputStream.Read(temp, 0, temp.Length); ms.Write(temp, 0, read_byte); BinaryFormatter bf = new BinaryFormatter(); ms.Position = 0; SendInfo sc = (SendInfo)bf.Deserialize(ms); ms.Close();
//// // Получение массива байт принятой картинки //// if (sc.filesize > 0) {
// Массив байт для сохранения принятой картинки // Размер массива = размеру картинки byte[] imageStream = new byte[sc.filesize];
// Создаем место в ОП для хранения полученной картинки MemoryStream ms_file = new MemoryStream(); do { temp = new byte[buffer_size]; read_byte = inputStream.Read(temp, 0, temp.Length);
// Записываем строго столько байтов сколько прочтено методом Read() ms_file.Write(temp, 0, read_byte);
// Как только получены все байты файла, останавливаем цикл, // иначе он заблокируется в ожидании новых сетевых данных if (ms_file.Length == sc.filesize) {
// Начинаем заполнять массив в нулевой позиции int count = 0;
// Set the position to the beginning of the stream. ms_file.Seek(0, SeekOrigin.Begin);
// Читаем байты и записываем их в массив while (count < ms_file.Length) { int rb = ms_file.ReadByte(); imageStream[count++] = Convert.ToByte(rb); }
// А вот здесь уже запись в базу или дальнейшие действия с картинкой //Bitmap bitmap2 = new Bitmap(ms_file); //bitmap2.Save(@"d:\image.jpeg");
ms_file.Close(); ms_file = null; break; } } while (read_byte > 0);
// Вот тот массив байт который я так жадил получить - imageStream
imageStream = null; temp = null; GC.Collect(); GC.WaitForPendingFinalizers(); }//*/ //// // Сохранение картинки на диск //// /*if (sc.filesize > 0) {
// Создадим файл на основе полученной информации и массива байтов следующих за объектом информации FileStream fs = new FileStream(Path.Combine("uploads", sc.filename), FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, sc.filesize); do { temp = new byte[1048576]; read_byte = inputStream.Read(temp, 0, temp.Length);
// Записываем строго столько байтов сколько прочтено методом Read() fs.Write(temp, 0, read_byte);
// Как только получены все байты файла, останавливаем цикл, // иначе он заблокируется в ожидании новых сетевых данных if (fs.Length == sc.filesize) { fs.Close(); fs = null; break; } } while (read_byte > 0);
temp = null; GC.Collect(); GC.WaitForPendingFinalizers(); }//*/
PrintLogs(sc.query + " " + sc.message + " " + sc.filename);
myTcpClient.buffer = new byte[9]; inputStream.BeginRead(myTcpClient.buffer, 0, myTcpClient.buffer.Length, new AsyncCallback(ReadCallback), myTcpClient);
} else { DeleteClient(myTcpClient); PrintLogs("Клиент отключился"); } } catch (Exception e) { DeleteClient(myTcpClient);
// Событие клиент отключился PrintLogs("Error: Клиент отключился аварийно. (" + e + ")"); SoundError();
}
}
|
|