0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 17

Роль потоков (Stream) в передаче данных по локальной сети (Socket)

01.04.2019, 10:43. Показов 1794. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте! Пишу клиент-серверное приложение. Задача: передать файл с сервера клиенту (по запросу клиента). Файл любого формата и размера. Я писал клиент-серверные приложения, но очень простые и то, это был копи паста. При поиске в интернете, нашёл коды в которых постоянно фигурируют классы NetworkStream, BinaryReader, FileStream и т.д. Вот коды:
Вариант №1:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Отправляем:
SInfo.StringsWriter.Write("123.exe");
SInfo.StringsWriter.Write("C:");
string FileName = @"D:\Шара\Gish_v1.3_RUS.exe";
FileStream Stream = File.OpenRead(FileName);
byte[] Buffer = new byte[128];
byte[] BytesInArray;
int BytesRead = -1;
while (BytesRead != 0)
{
BytesRead = Stream.Read(Buffer, 4, 124);
BytesInArray = BitConverter.GetBytes(BytesRead);
BytesInArray.CopyTo(Buffer, 0);
SInfo.StringsWriter.Write(Buffer);
}
Stream.Close();
Console.WriteLine("Transfer complete");
 
// и получаем:
ClInfo[IDClient].StringsWriter.Write("Name");
string FileName = ClInfo[IDClient].StringsReader.ReadString();
LogWrite("Имя файла определенно - " + FileName, ConsoleColor.DarkYellow);
ClInfo[IDClient].StringsWriter.Write("Folder");
string FolderName = ClInfo[IDClient].StringsReader.ReadString();
LogWrite("Путь к папке определен - " + FolderName, ConsoleColor.DarkYellow);
FileStream Writing = File.OpenWrite(FolderName + @"\" + FileName);
byte[] Buffer = new byte[128];
byte[] BytesInArray = BitConverter.GetBytes(-1);
BytesInArray.CopyTo(Buffer, 0);
LogWrite("Начинаю прием файла " + FileName, ConsoleColor.DarkYellow);
while (BitConverter.ToInt32(Buffer, 0) != 0)
{
Buffer = ClInfo[IDClient].StringsReader.ReadBytes(128);
Writing.Write(Buffer, 4, BitConverter.ToInt32(Buffer, 0));
}
LogWrite("Файл " + FileName + " успешно получен!", ConsoleColor.DarkGreen);
Writing.Close();
LogWrite("Файл " + FileName + " сохранен в папке " + FolderName + "!", ConsoleColor.DarkGreen);

Вариант №2:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        // Код для приёма файла на стороне сервера
        static void uploadFile(NetworkStream ns)
        {
            byte[] buf = new byte[1024];
            int count;
            FileStream fs = new FileStream("uploadFile.txt", FileMode.Open);
            BinaryReader br = new BinaryReader(fs);
            fs.Close();
 
            byte[] sizeFile = BitConverter.GetBytes(fs.Length);
            // Передаем размер файла
            ns.Write(sizeFile, 0, sizeFile.Length);
 
            Thread.Sleep(500);
            BinaryFormatter formater = new BinaryFormatter();
 
            while ((count = br.Read(buf, 0, 1024)) > 0)
            {
                formater.Serialize(ns, buf);
            }
        }
 
        // Код для передачи файла на стороне клиента
        static void sendFile(Socket client, NetworkStream ns)
        {
            byte[] buffe = new byte[client.ReceiveBufferSize];
            // ns = NetworkStream
            ns.Read(buffe, 0, buffe.Length);
            int sizeFile = BitConverter.ToInt32(buffe, 0);
 
            MemoryStream ms = new MemoryStream();
            BinaryFormatter formater = new BinaryFormatter();
 
            while (sizeFile > ms.Length)
            {
                ms.Write((byte[])formater.Deserialize(ns), 0, 1024);
                //sizeFile -= 1024;
            }
            File.WriteAllBytes("sendFile.txt", ms.ToArray());
        }


Вопрос: Как вообще это всё работает? Я вижу циклы в которых байты записываются в поток (stream), как я понимаю. Но никогда не вижу что бы они отправлялись (то есть метод (Socket) client.Send("А здесь например отправить поток")). И вообще не вижу ничего что говорит о том что сокет как-то используется, вижу манипуляции с байтами (как я полагаю), причём в процессе судя по всему происходит отправка файла. Объясните пожалуйста, как это работает? Причём тут поток и как этот поток влияет на отправку байтов по сети. Причём без метода Send. И в чём смысл метода Send? Когда вызывается метод Send, отправляется поток?

Как я вижу принцип работы отправки файла по сети: Перед отправкой файла, устанавливается соединение и файл отправляется, но перед отправкой, конвертируется в байты. А потом я не могу понять принцип работы... Файл преобразовывается в байты? Весь файл преобразовывается или только часть? И как эти части отправляются (если часть)? Или как отправляется весь файл? В общем "тут мои полномочия всё...". Объясните пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.04.2019, 10:43
Ответы с готовыми решениями:

При передаче данных по локальной сети на сервер в базу sql передается только часть данных
Всем доброго времени суток! У меня ситуация такая – есть своя программа на Delphi 2010 для перегонки данных из html-файлов в базу на sql...

Не мог понять в чем ошибка в передаче данных по локальной сети
Реализовал программу для передачи сообщений по локальной сети(Интерфейс на скр.1(прикрепил к сообщению)) и создал сервер (C++) которая...

Роль шнура при передаче данных (используется 1) док-станция и 2) внешний жесткий диск)
Купил док-станцию на 2 жестких диска. Она USB 2.0. С ней шел шнур USB AM-BM (как для принтера). Вставил в нее HDD. Т.е. этот HDD без...

4
10 / 8 / 2
Регистрация: 23.10.2017
Сообщений: 45
01.04.2019, 22:08
Так я отправляю:
C#
1
2
3
Socket sock;
...
sock.SendFile("С:\\file.txt"); // отправить файл на подключенный сокет
Так принимаю:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
byte[] data = new byte[4]; // Буфер для приема ответа
int bytes = 0; // Переменная для числа принятых байт
FileStream file = new FileStream("C:\\file.txt", FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None);
 
do
{
   bytes = sock.Receive(data, SocketFlags.None); // Получаем число принятых байт
   if (bytes == 0) // Если bytes пуст, прекращаем цикл
      break;
   file.Write(data, 0, data.Length); // Записываем байты в FileStream
}
while (sock.Available > 0); // Проверяем есть ли доступные данные в сокете для чтения
 
sock.Shutdown(SocketShutdown.Both); // Отключаем Socket
sock.Close(); // Закрываем Socket
file.Close(); // Закрываем FileStream
1
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
01.04.2019, 22:33
А НАХРЕНА ВСЁ ЭТО НУЖНО !!!
Ответ : "Для локальной сети !".

Добавлено через 4 минуты
Vagrant0610,ЦА-ЦА !!!
0
Эксперт .NET
6525 / 4101 / 1606
Регистрация: 09.05.2015
Сообщений: 9,564
01.04.2019, 23:14
Цитата Сообщение от Vagrant0610 Посмотреть сообщение
Я вижу циклы в которых байты записываются в поток (stream), как я понимаю. Но никогда не вижу что бы они отправлялись (то есть метод (Socket) client.Send("А здесь например отправить поток")).
Вы не поверите, но при записи в NetworkStream происходит отправка...
0
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 17
02.04.2019, 04:06  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Вы не поверите, но при записи в NetworkStream происходит отправка...
То есть, например при вызове метода networkStream.WriteByte(byte), происходит отправка?

Можете пожалуйста объяснить принцип передачи данных по сети? Вот я хочу написать программу которая будет передавать данные по сети, с чего мне начать и какой принцип работы этапов передачи данных и соединения? Буду очень благодарен за ответ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.04.2019, 04:06
Помогаю со студенческими работами здесь

Как настроить socket НЕ для локальной сети
Такая идея: хотелось бы, чтобы две программы на python могли передавать между собой байты. в локальной сети у меня всё отлично работает,...

Какую роль в локальной базе данных дают админу сайта?
Есть веб проект который я залил на IIS, нужно подключить бд к ней, вот для доступа к бд мне надо какраз создать ак sql server и дать ему...

Передача данных по сети (TCP, Socket)
Никак не могу понять в каком именно месте ошибка. С клиента на сервер передаются данные. Сначала название будущего файла, а затем строка...

Совет по передачи данных по сети в несколько потоков
Проблема заключается в следующем: я организовал простой сервер который работает с одним портом и может принимать множество клиентов и и...

Безопасности данных в локальной сети
В конторе 5 компов и 1 сервер. На сервере висит сайт для клиентов. Еще имеется 3 ноута для девочек и 2 пк на которых храниться вся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

Новые блоги и статьи
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru