Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
1 / 1 / 0
Регистрация: 23.03.2015
Сообщений: 14

Передача файлов по локальной сети

31.03.2015, 19:12. Показов 8039. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
скиньте пожалуйста исходники с рабочим примером передачи текстовых документов по локальной сети через серверсокет и клиентсокет заранее спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2015, 19:12
Ответы с готовыми решениями:

Передача сообщений по локальной сети
Может кто подкинуть простейший пример передачи текстовых сообщений хотябы между 2 компами

Передача нажатия клавиши по локальной сети.
Добрый день. Есть потребность написать приложение с сервером и клиентом. Два клиента подключаются к серверу, при нажатии определенной...

Передача сообщения по локальной сети (indy)
кто знает объясните пожалуйста разницу между TClientSocket-TServerSocket и компонентами indy TIdTCPClient-TIdTCPServer дело в том что...

3
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
31.03.2015, 19:16
Источник
Передача файлов в C++Builder через TClientSocket и TServerSocket

Очень часто возникают вопросы по работе с TServerSocket и TClientSocket, а толкового описания работы с ними нету. Максимум что можно найти в Интернете - исходники чата и то для Delphi. Поэтому, чтобы понять принцип работы компонентов TClientSocket и TServerSocket в С++, предлагаю написать программу, которая будет осуществлять файловый трансфер.

В общих чертах передача файлов через сокеты выглядит следующим образом: вся информация передается пакетами, и если в одном из пакетов встречается #file - это значит, что пришел заголовок файла с последующей информацией о нем (имя, размер) и клиент должен принимать файл указанного размера. В чистом виде заголовок файла выглядит так: file#filename#filesize#. Когда клиент принимает такой заголовок, он обрабатывает его(выделяет имя файла и его размер), создает буфер размером filesize и в него пишет всю последующую информацию. Когда размер переданной информации равен размеру файла, посылает на сервер команду \"end\", сервер обрабатывает эту команду и закрывает поток.

Итак, начнем мы с того, что определимся, кто будет посылать файл, а кто принимать. В моем примере - Сервер отправляет файл, а клиент принимает, все просто, ничего сложного здесь нету. Дальше нужно оформить внешний вид клиента и сервера. У меня они выглядят так:


Я не цеплял на формы ничего лишнего, так как у нас нету цели сделать программу красивой, наша цель - правильная работа приложения. С внешним видом разобрались, можно переходить непосредственно к программированию.

Сейчас будем писать сервер - он будет отправлять файлы.

Сервер:
На форме: OpenDialog1 (TOpenDialog), Server (TServerSocket), Memo1 (TMemo) и две кнопки.

Сначала настроим Server:

C++
1
2
Port = 1001 ; // Порт по которому будет работать и клиент и сервер
Active = false ; // Пока неактивен
Эти настройки можно выбрать в Object Inspector\'е.

Перейдем на вкладку Events и опишем подключение и отключение клиента:

В OnAccept:

C++
1
Memo1->Lines->Add(\"К Вам подключились ;\");
...
0
1 / 1 / 0
Регистрация: 23.03.2015
Сообщений: 14
03.04.2015, 23:06  [ТС]
не работает вот рабочий источник
Очень часто возникают вопросы по работе с TServerSocket и TClientSocket, а толкового описания работы с ними нету. Максимум что можно найти в Интернете - исходники чата и то для Delphi. Поэтому, чтобы понять принцип работы компонентов TClientSocket и TServerSocket в С++, предлагаю написать программу, которая будет осуществлять файловый трансфер.

В общих чертах передача файлов через сокеты выглядит следующим образом: вся информация передается пакетами, и если в одном из пакетов встречается #file - это значит, что пришел заголовок файла с последующей информацией о нем (имя, размер) и клиент должен принимать файл указанного размера. В чистом виде заголовок файла выглядит так: file#filename#filesize#. Когда клиент принимает такой заголовок, он обрабатывает его(выделяет имя файла и его размер), создает буфер размером filesize и в него пишет всю последующую информацию. Когда размер переданной информации равен размеру файла, посылает на сервер команду "end", сервер обрабатывает эту команду и закрывает поток.

Итак, начнем мы с того, что определимся, кто будет посылать файл, а кто принимать. В моем примере - Сервер отправляет файл, а клиент принимает, все просто, ничего сложного здесь нету. Дальше нужно оформить внешний вид клиента и сервера.
Сейчас будем писать сервер - он будет отправлять файлы.
Сервер:

На форме: OpenDialog1 (TOpenDialog), Server (TServerSocket), Memo1 (TMemo) и две кнопки.

Сначала настроим Server:
C++
1
2
Port = 1001 ; // Порт по которому будет работать и клиент и сервер
Active = false ; // Пока неактивен
Эти настройки можно выбрать в Object Inspector'е.

Перейдем на вкладку Events и опишем подключение и отключение клиента:

В OnAccept:
C++
1
Memo1->Lines->Add("К Вам подключились ;");
Для OnError:
C++
1
2
ErrorCode = 0 ;
ShowMessage("Server Error");
Теперь напишем обработчик для нажатия кнопки запуска сервера:
C++
1
2
3
Server->Active = true ;
Server->Open() ;
Memo1->Lines->Add("Создан сервер.");
Теперь нужно создать поток, который мы и будем передавать клиенту:
TMemoryStream *MS = new TMemoryStream ;

А теперь подходит время к самому главному в описании сервера - передачи файла клиенту. Пишем в обработчике кнопки Send (Отправить файл):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void *P; // указатель на файл
int Size; // размер
if( OpenDialog1->Execute() )
{
 MS->LoadFromFile( OpenDialog1->FileName ); // выбираем файл 
 Memo1->Lines->Add( "Загрузили требуемый файл в поток..." ); // заполняем лог 
}
Server->Socket->Connections[0]->SendText( "file#" + OpenDialog1->FileName + "#" + IntToStr( MS->Size ) + "#" ); 
// отправляем заголовок
 
Memo1->Lines->Add ( "Послали заголовок" );
MS->Position = 0 ; // Устанавливаем поток в начальную позицию ;
P = MS->Memory ; // присваиваем указателю поток файла
Size = Server->Socket->Connections[0]->SendBuf( P , MS->Size ); // отправляем буфер клиенту; Size
  //равно размеру отправленной информации
Memo1->Lines->Add( "Отправлено: " + IntToStr( Size ) + " из " + IntToStr( MS->Size ) ); // заполняем лог
С отправкой все в порядке, но серверу еще необходимо обработать команду "end", которая придет тогда, когда клиент примет файл. Для этого в OnClientRead пишем:
C++
1
2
3
4
5
if(Server->Socket->Connections[0]->ReceiveText()=="end") // если клиент прислал команду "end"
{
 Memo1->Lines->Add("Клиент принял файл"); // записываем в лог
 MS->Clear() ; // Очищаем поток
}
С сервером и отправкой файла все готово, дальше нужно написать клиента, который бы принимал поток пакетов от сервера. Чем мы и займемся.
Клиент:

Для программы-клиента основной задачей является получение информации о файле, который передает клиент и получение, и сохранение самого файла. Итак, на форме - Client (TClientSocket) , Memo1 (TMemo), SaveDialog1 (TSaveDialog) и кнопка соединения - Button1.

Снова начнем с того, что настроим Client (TClientSocket1):
C++
1
2
3
4
Port = 1001 ; // Клиент и сервер должны работать на одинаковых портах 
Active = false ; // Пока неактивен
Address = 127.0.0.1 ; // Адрес укажем пока свой, что б протестировать работу сервера и клиента локально
Host = 127.0.01 ;
Далее, объявим переменные, которые нам будут необходимы:

В *.h-файле проекта, в секции private объявим:
C++
1
2
private: 
 AnsiString Name;
После этого в *.cpp файле объявляем:
C++
1
2
3
4
5
TMemoryStream *MS = new TMemoryStream ; // создаем поток под принимаемый файл
void Write( AnsiString Text ); // ф-я записи получаемой информации в поток
int Size ; // размер передаваемого файла
bool Receive ; // передаем ли мы на данный момент файл
AnsiString FileName ; // имя файла
Следующим шагом создания клиента - будет описание функции Write. Она должна сохранять получаемую информацию в файл.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Write( AnsiString Text )
{
 if(MS->Size < Size) // если мы еще принимаем файл и размер потока меньше размера файла
 {
  MS->Write( Text.c_str() , Text.Length() ); // записываем в поток
  Form1->Memo1->Lines->Add( "Принимаем данные..." ); // пишем лог
 }
 if(MS->Size == Size) // если файл принят и размер потока соответствует размеру файла
 {
  Receive = false ; // останавливаем режим передачи
  MS->Position = 0 ; // переводим каретку потока в начало
  Form1->Client->Socket->SendText( "end" ); // пишем серверу, что мы приняли файл
  CreateDir( "Downloads" ); // создаем папку для сохраненных файлов
  MS->SaveToFile( "Downloads\\"+FileName ); // сохраняем туда наш файл
  MS->Clear() ; // освобождаем поток
  Size = 0 ;
  Form1->Memo1->Lines->Add("Файл принят !"); // пишем в лог что файл принят
 }
}
Далее, важно еще правильно описать событие OnRead, вот как оно должен выглядеть:
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
void __fastcall TForm1::ClientRead( TObject *Sender,
  TCustomWinSocket *Socket )
{
 AnsiString Rtext ; // текст, который посылает сервер
 Rtext = Client->Socket->ReceiveText() ;
 if( Receive == true ) // если мы в режиме передачи файла, то
 {
  Write( Rtext ); // записываем его в поток
 }
 else // если нет , то
 {
  Memo1->Lines->Add( "Приняли текст :" + Rtext ); // пишем в лог все что принимаем от сервера
  if(Rtext.SubString( 0,Rtext.Pos("#")-1) == "file" ) // Если это строка типа 
  // file#filename#filesize#, то начинаем парсерить полученную информацию :
  {
  Rtext.Delete( 1 , Rtext.Pos( "#" ) ) ; // удаляем слово file
  Name = Rtext.SubString( 0 , Rtext.Pos( "#" ) -1 );// Определяем имя файла
  FileName = Name.SubString( Name.LastDelimiter( "\\" ) + 1 , Name.Length() );
  // Выделяем чистое имя файла , например с c:\\test.txt , берем test.txt
  Rtext.Delete( 1 , Rtext.Pos( "#" ) ); // Удаляем последний разделитель
  Size = StrToInt( Rtext.SubString( 0 , Rtext.Pos( "#" ) - 1) ) ; // Определяем размер файла
  Rtext.Delete( 1 , Rtext.Pos( "#" ) ); // Удаляем последний разделитель
  Memo1->Lines->Add( "Размер файла: " + IntToStr( Size ) + " байт" ); // Выводим размер файла в лог
  Memo1->Lines->Add( "Имя файла: " + Name ); // Выводим имя файла в лог
  Receive = true; 
  // Переводим сервер в режим приёма файла
   
  }
 }
}
Все самое страшное позади, и теперь осталось только описать события OnConnect и OnError:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::ClientConnect( TObject *Sender,
  TCustomWinSocket *Socket )
{
 Memo1->Lines->Add( "Вы присоеденились ;" );
}
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ClientError( TObject *Sender,
  TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode )
{
 ErrorCode = 0;
 ShowMessage( "Client Error" );  
}
А так же написать обработчик для кнопки соединения:
C++
1
2
3
4
5
void __fastcall TForm1::Button1Click( TObject *Sender )
{
 Client->Open() ; // открываем 
 Memo1->Lines->Add( "Коннектимся..." );
}
Вот и все готово, теперь можно протестировать, что же у нас получилось. Все принятые файлы клиент сохранят в папку Downloads.
0
1 / 1 / 0
Регистрация: 23.03.2015
Сообщений: 14
29.05.2015, 01:17  [ТС]
помогите не могу понять как описать передачу файлов с клиента на сервер.

Цитата Сообщение от meruva Посмотреть сообщение
C++
1
2
3
4
5
 if(Server->Socket->Connections[0]->ReceiveText()=="end") // если клиент прислал команду "end"
 {
 Memo1->Lines->Add("Клиент принял файл"); // записываем в лог
 MS->Clear() ; // Очищаем поток
 }
это код сервера когда вставляю в клиент ругается на коннектионс на что заменит чтоб в клиенте работала передача файлов на сервер
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.05.2015, 01:17
Помогаю со студенческими работами здесь

Передача файла по локальной сети с помощью сокетов
Как организовать передачу файла по локальной сети с помощью сокетов? Что нужно писать в программе сервер и в программе клиент

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

Передача файлов по локальной сети
Подскажите пожалуйста, какими способами (легче всего) осуществить передачу файлов (синхронизацию файлов) по локалке? Т.е. чтобы по...

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

Передача группы файлов по локальной сети
Добрый день. Мне нужно передать по локальной сети клиентам несколько файлов. Код для передачи нашел в инете, все сделал вроде как надо, но...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru