Программа написана на Delphi и представляет собой простое приложение клиент-сервер с использованием сокетов. Сокет сервера (ServerSocket1) слушает входящие соединения, и когда соединение установлено, он отправляет содержимое файла ('c:\temp\test.html') клиенту.
Вот некоторые вещи, которые можно улучшить:
В процедуре ClientSocket1Read вы читаете данные из сокета, записываете их в поток (FStream) и затем освобождаете память. Но что если клиент отключится, когда еще есть данные, которые пишутся в файл? Нужно добавить проверку ошибок для обработки этой ситуации.
Процедура FormCreate только инициализирует FStream в nil. Лучше было бы освободить любые существующие потоки перед инициализацией нового.
В процедурах ClientSocket1Disconnect и FormDestroy вы освобождаете FStream, но что если он не был назначен? Нужно добавить проверку ошибок для этого.
Путь к файлу 'c:\temp\test.stream.html' жестко закодирован. Лучше было бы сделать это настройкой или использовать более надежный способ указания пути к файлу.
При отправке файла с сервера вы используете метод SendStream, который отправляет файл в блоки. Это может привести к проблемам, если клиент не прочитает все данные перед отключением. Более надежным способом было бы отправить длину файла первым и затем фактические данные.
В этом решении я убрал процедуру ClientSocket1Connect, так как она не нужна. В процедуре ServerSocket1ClientConnect я отправляю размер файла первым, а затем фактические данные. Так клиент может знать, сколько данных ожидать, перед тем как прочитать из сокета.
procedureTForm1.ClientSocket1Read(Sender:TObject;Socket:TCustomWinSocket);variLen:Integer;Buf:Pointer;beginifnotAssigned(FStream)thenExit;iLen:=FStream.Size;GetMem(Buf,iLen);tryFStream.Position:=0;FStream.Read(Buf^,iLen);Socket.SendBuf(Buf^,iLen);finallyFreeMem(Buf);end;end;procedureTForm1.ServerSocket1ClientConnect(Sender:TObject;Socket:TCustomWinSocket);varFileSize:Integer;beginFStream:=TFileStream.Create('c:\temp\test.html',fmOpenReadorfmShareDenyWrite);tryFileSize:=FStream.Size;Socket.SendBuf(PChar(IntToHex(FileSize,8)),8);// Send the file size as a stringFStream.Position:=0;Socket.SendBuf(FStream.Memory^,FileSize);// Send the actual file datafinallyFStream.Free;end;end;procedureTForm1.btnTestSocketsClick(Sender:TObject);beginServerSocket1.Active:=True;ClientSocket1.Active:=True;end;
В статье рассматривается пример использования библиотеки ScktComp в Delphi для отправки файла от серверного сокета на клиентский с помощью метода SendStream.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.