|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
24.03.2008, 16:15 | #1 |
Регистрация: 23.02.2008
Сообщений: 4
|
Передача функции TServerSocket и TFileStream
Возможно я щас задам очень глупый вопрос, но заранее прошу извенений - что-то я недогоняю..
Я пишу смесь чата с почтовиком, если так можно выразиться, (сервер с несколькими клиентами) с возможностью отправки файлов. на форме 3 элемента управления ServerSocket1, ServerSocket2, ServerSocket3 соответственно (это не на главной форме и только для файлов). Предполагается что пользователь шлет файлы на тот сокет, который сейчас свободен. Вот код одной из процедур, которая в зависимости от того какой порт свободен создает один из трех потоков (для каждого сервера сделал свою глобальную переменную потока): procedure TFormFiles.CreateStream(ctFromNik, ctToNik, ctFile : String; ctFileSize : LongWord; ctCurServSocket : TServerSocket; ctCurFStream : TFileStream); var homeDir: String; begin homeDir := ExtractFilePath(Application.ExeName ) + 'ReceiveFiles\'; if not DirectoryExists(homeDir+ctToNik) then begin CreateDirectory(PChar(homeDir+ctToN ik+'\Temp\'), nil); end; ctCurFStream := nil; //!!!!!!! ctCurFStream := TFileStream.Create //!!!! (homeDir+ctToNik+'\Temp\'+ctFile, fmCreate or fmShareDenyWrite); ctCurServSocket.Active := True; end; Вызываю процедуру так CreateStream(strFromNik, strToNik, strFile, lwFileSize, ServerSocket1, FStream1); FStream1 - это глобальная переменння на форме Я вот думаю это наверное надо таким образом через указатели делать? не подскажите? А еще один ворпос - как в событии ServerSocket1ClientRead отличить когда приходят сообщения, а когда файлы (потоки тобишь), т.е. когда клиент шлет SendText, а когда SendStream? |
26.03.2008, 16:13 | #2 |
Регистрация: 23.02.2008
Сообщений: 4
|
В общем я уже сам разобрался. На счет передачи в функцию объектов TServerSocket и TFileStream в качестве параметров - это я просто обошел. А вот на счет второго - как определить когда клиент шлет SendText, а когда SendStream в ServerSocket1ClientRead - сделал следующим образом:
procedure TFormFiles.ServerSocketFile1ClientR ead(Sender: TObject; Socket: TCustomWinSocket); var iLen, iFileSize: Integer; Bfr: Pointer; rText, rCmd: String; {FStream, gFileSize и homeDir - Глобальные переменные} begin if Socket.ReceiveLength <> 0 then begin iLen := Socket.ReceiveLength; GetMem(Bfr, iLen); try Socket.ReceiveBuf(Bfr^, iLen); if bfr = nil then exit; rText := String(copy(String(bfr), 1, iLen)); //В качестве специальных символов используем #166+#166 //Если они есть, то это сообщение, если нет то файл rCmd := copy(rText, 1, pos(#166+#166, rText)-1); if rCmd <> '' then begin //Пользователь собирается слать файлы if rCmd = 'fs|' then //Прищла команда fs|имя_файла|размер begin delete(rText, 1, pos('|', rText)); rCmd := copy(rText, 1, pos('|', rText)-1); //имя_файла delete(rText, 1, pos('|', rText)); //размер //копирую без конечных #166+#166 gFileSize := StrToInt(copy(rText, 1, pos(#166+#166, rText)-1)); FStream := TFileStream.Create (homeDir + rCmd {Путь к файлу}, fmCreate or fmShareDenyWrite); end else if rCmd = 'fr0|' then begin //Больше файлов не будет - делаем сервер неактивным ServerSocketFile1.Active := False; end end else //Пришел файл begin FStream.Write(Bfr^, iLen); end; //Если файл пришел полностью то освобождаем поток if FStream.Size = gFileSize1 then begin formMain.ListBoxLog.Items.Add('Прие м файла '+ ExtractFileName(FStream1.FileName)+ ' закончен'); FStream.Free; FStream := nil; gFileSize := 0; end; finally FreeMem(Bfr); bfr := nil; end; end; end; Только если вдруг клиент будет слать текстовый файлик с двумя специальными символами (#166+#166). То возникает баг.. Если кто-то знает как можно реализовать более умным способом подскажите плиз. Последний раз редактировалось dns-s; 26.03.2008 в 16:19. |
26.03.2008, 21:15 | #3 |
Форумчанин
Регистрация: 15.01.2008
Сообщений: 117
|
Перед отправкой файла, посылается текст допустим 'SendFile<размер файла>#0', после получатель выбирает размер файла, и получает его. p.s. более подробно это описано в книги Фленова "Delphi глазами хакера"
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Передача файла через TServerSocket и TClientSocket | Vanya | Работа с сетью в Delphi | 10 | 08.04.2008 18:12 |
проблемы с TFileStream | andrey4623 | Общие вопросы Delphi | 9 | 01.11.2007 20:44 |
сохранение изображения с TFileStream | andrey4623 | Общие вопросы Delphi | 10 | 20.10.2007 20:28 |
TFilestream | UnD)eaD)Snake | Win Api | 1 | 27.09.2007 21:22 |