![]() |
|
|
![]()
|
|
| Гость_Лена |
|
|||
|
Unregistered |
В клиентском приложении отправляю двоичный файл на сервер
TFileStream * SF = new TFileStream(OpenDialog1->FileName, fmOpenRead); ClientSocket1->Socket->SendStream(SF); Как организовать диспечерезацию на принимающем сервере (ServerSocket), чтобы он понял, что пришел двоичный файл? Если отправлю текст методом SendText(), то тут все просто, в начале текста ставлю значок “#”, затем на сервере удалю его и работаю с оставшимся текстом. Соответственно как принять от сервера обработанный двоичный файл, что писать вместо многоточия и правильно ли это? Предварительно имя двоичного файла уже занесено в SaveDialog1->FileName if(SaveDialog1->Execute()) { TFileStream *SF = new TFileStream(SaveDialog1->FileName.c_str(), fmCreate); int Bufer = Socket->ReceiveLength(); SF->CopyFrom((Socket->ReceiveBuf(..... ,Bufer)), 0); //как тут правильно? SF->Free(); } |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 1 Всего: 484 |
Сначала нужно послать на ту сторону информацию о файле (имя, размер, способ передачи, др. необходимую инфу).
Потом дождаться ответа, что все ОК. После этого смело слать поток. На той стороне уже будут ждать нужный объем информации. |
|||
|
||||
| Гость_Лена |
|
|||
|
Unregistered |
Компоненты ServerSocket и ClientSocket.
В клиентском приложении посылаю файл: try { TFileStream * SF = new TFileStream(OpenDialog1->FileName, fmOpenRead); ClientSocket1->Socket->SendStream(SF); } catch(...) { ShowMessage("Ошибка передачи"); } В серверном обрабатываю и посылаю клиентам. Где ошибка? Как правильно? int Bufer = Socket->ReceiveLength(); TFileStream * Bufs; Socket->ReceiveBuf(Bufs, Bufer); try { ServerSocket1->Socket->SendStream(Bufs); } catch(...) { ShowMessage("Ошибка"); } |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 1 Всего: 484 |
После Socket->ReceiveBuf(Bufs, Bufer);
Воткни Socket->Position=0; И на сервере, вместо TFileStream используй TMemoryStream. И посмотри в FAQ пример передачи файла по сети. |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Спасибо! Буду разбираться в FAQ.
Пока попробывала Ваши рекомендации вместо TFileStream использовать TMemoryStream, но тогда не проходит строчка в клиентском приложении вместо TFileStream * SF = new TFileStream(OpenDialog1->FileName, fmOpenRead); получаю TMemoryStream * SF = new TMemoryStream(OpenDialog1->FileName, fmOpenRead); в результате этот метод не проходит, потому что второй параметр fmOpenRead его не устраивает. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 1 Всего: 484 |
Естественно. Для клиента нужно оставить файлстрим, а вот серверу он совсем ни к чему.
Да и зачем изобретать велосипед - все уже давно написано. Бери пример и подстраивай под свои нужды. |
|||
|
||||
| Гость_Лена |
|
|||
|
Unregistered |
На форуме нашла пример на паскале, совсем не понятно. В Help Builder нашла как пересылать текст, но с этим все понятно. Других примеров тоже не нашла в сети, только на паскале.
Мой новый вариант, тоже не работает: Отправка сообщения на сервер из клиентского сообщения. TFileStream * SF = new TFileStream(OpenDialog1->FileName, fmOpenRead); ClientSocket1->Socket->SendStream(SF); Прием на сервере ServerSocket1ClientRead и отправка клиентам int Bufer = Socket->ReceiveLength(); char * Bufs = new char[Bufer+1]; Socket->ReceiveBuf(Bufs, Bufer); TMemoryStream* str = new TMemoryStream (); str->Position = 0; str->WriteBuffer((void*)Bufs,Bufer); str->Position = 0; try { for(int i= 0;i<ServerSocket1->Socket->ActiveConnections ;i++) ServerSocket1->Socket->Connections[i]->SendBuf((void*)str,Bufer); } catch(...) { ShowMessage("Ошибка"); } delete Bufs; str->Free(); return; Тоже не работает. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 1 Всего: 484 |
Тогда скорее так:
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
На стороне сервера после прохождения строк
for(int i= 0;i<ServerSocket1->Socket->ActiveConnections ;i++) { ServerSocket1->Socket->Connections[i]->SendStream(str); str->Position = 0; } Возникает исключение raised exception class EAcceessViolation На клиенте после строки ClientSocket1->Socket->SendStream(SF); Тоже исключение raised exception class EAcceessViolation |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 1 Всего: 484 |
Ну, это уже другая песня. Может серверный сокет не создан, а может просто клиентов у него нет, а может... Это все в другом месте. Попробуй для теста сначала просто из мемористрима сохранить в файл, чтобы убедиться, что хотя бы первая часть работает. |
|||
|
||||
| cenix |
|
|||
|
/dev/null ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 7.8.2004 Репутация: нет Всего: 4 |
Мне что-то кажется, что у вас ошибка в том, что вы думаете, что когда на сервере наступает событие OnRead, тогда приходит весть отосланный стрим с клиента, на самом деле он приходит пачками, в зависимости от нагруженности сети и другой байды
поэтому я делал так: сначала посылал размер файла, а затем уже стрим(можно размер вшивать в сам стрим, но с этим больше парится |
|||
|
||||
| Гость_Лена |
|
|||
|
Unregistered |
>Мне что-то кажется, что у вас ошибка в том, что вы думаете, что когда на сервере наступает событие OnRead, тогда приходит весть отосланный стрим
Да, именно так я и предпологала! >если надо, могу выслать свой исходник Буду Вам очень благодарна! Мой адрес [email protected] Заранее спасибо! |
|||
|
||||
| cenix |
|
|||
|
/dev/null ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 7.8.2004 Репутация: нет Всего: 4 |
отправил, неплохо бы зрагестрироватся...........
|
|||
|
||||
| codelord |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 777 Регистрация: 7.5.2005 Где: ты моя темноглаза я где?! Репутация: 16 Всего: 39 |
cenix Если можно и мне такой кодик. Заранее огромное спасибо. У меня тоже проблема с пересылкой файлов. [email protected]
|
|||
|
||||
| Adil' |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 26.8.2004 Где: Питер Репутация: 4 Всего: 15 |
-------------------- Удачи |
|||
|
||||
| Гость_Влад |
|
|||
|
Unregistered |
Товарищи, а что у меня не правельно здесь?
В этом алгоритме при пересылке файла больше 1 Мгб все умирает, где подправить, чтобы алгоритм пересылки был надежен? Клиент: Глобальные переменные: int Size ; TMemoryStream *MS = new TMemoryStream ; Посылка из клиента в событии ClientSocket1Read: MS->LoadFromFile( OpenDialog1->FileName ); MS->Position = 0 P = MS->Memory ClientSocket1->Socket->SendText("Z" + IntToStr(MS->Size)); Size = ClientSocket1->Socket->SendBuf( P , MS->Size ); MS->Clear(); Прием на сервере: Глобальные переменные: bool ful = false; TMemoryStream* MS = new TMemoryStream (); int Size; В событии ServerSocket1ClientRead: S = Socket->ReceiveText(); if(S[1] == 'Z') { ful = true; AnsiString SizeFile = S.SubString(S.Pos("Z")+1,S.Length()); Size = StrToInt(SizeFile); S.Delete( 1 , S.Pos( "Z" ) ) ; return; } if(ful) { Write(S); } else {…другой код} Ф-ция записи Write: void Write( AnsiString Text ) { if(MS->Size < Size { MS->Write( S.c_str() , S.Length() ); } if(MS->Size == Size) { MS->Position = 0 ; CreateDir( "Dow" ); AnsiString Path; Path = SFiles.SubString( SFiles.LastDelimiter( "\\" ) + 1 , SFiles.Length() ); MS->SaveToFile( "Dow\\"+Path ); MS->Clear() ; Size = 0 ; ful = false; } } |
|||
|
||||
| Гость_Влад |
|
|||
|
Unregistered |
Товарищи, найдите ошибку при пересылке файла больше
1 Мгб все умирает, где подправить, чтобы алгоритм пересылки был надежен? Клиент: Глобальные переменные: int Size ; TMemoryStream *MS = new TMemoryStream ; Посылка из клиента в событии ClientSocket1Read: MS->LoadFromFile( OpenDialog1->FileName ); MS->Position = 0 P = MS->Memory ClientSocket1->Socket->SendText("Z" + IntToStr(MS->Size)); Size = ClientSocket1->Socket->SendBuf( P , MS->Size ); MS->Clear(); Прием на сервере: Глобальные переменные: bool ful = false; TMemoryStream* MS = new TMemoryStream (); int Size; В событии ServerSocket1ClientRead: S = Socket->ReceiveText(); if(S[1] == 'Z') { ful = true; AnsiString SizeFile = S.SubString(S.Pos("Z")+1,S.Length()); Size = StrToInt(SizeFile); S.Delete( 1 , S.Pos( "Z" ) ) ; return; } if(ful) { Write(S); } else {…другой код} Ф-ция записи Write: void Write( AnsiString Text ) { if(MS->Size < Size { MS->Write( S.c_str() , S.Length() ); } if(MS->Size == Size) { MS->Position = 0 ; CreateDir( "Dow" ); AnsiString Path; Path = SFiles.SubString( SFiles.LastDelimiter( "\\" ) + 1 , SFiles.Length() ); MS->SaveToFile( "Dow\\"+Path ); MS->Clear() ; Size = 0 ; ful = false; // } } |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |