Передача файлов без FTP: использование сокетов в Delphi
Одним из способов прямой связи между приложениями через интернет без использования публичного IP-адреса является использование сокетов. В этом материале мы рассмотрим, как реализовать передачу файлов между компьютерами в разных сетях с помощью сокетов в Delphi.
Что такое сокеты?
Сокеты — это механизм, позволяющий приложениям обмениваться данными через сеть. В Delphi для работы с сокетами используется компонент TTCPClient (для клиента) и TTCPServer (для сервера), находящийся в модуле Winapi.Sockets.
Реализация передачи файлов без FTP
Для передачи файлов без FTP мы будем использовать сокеты для прямой связи между двумя компьютерами. Ниже приведен пример кода на Object Pascal (Delphi) для клиента и сервера.
Клиент
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winapi.Sockets;
type
TForm1 = class(TForm)
btnSend: TButton;
edtFileName: TEdit;
procedure btnSendClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btnSendClick(Sender: TObject);
var
Socket: TTCPClient;
FileStream: TMemoryStream;
Buffer: array[0..1023] of byte;
ReadBytes: integer;
begin
Socket := TTCPClient.Create(nil);
try
Socket.Host := '192.168.1.100'; // IP-адрес сервера
Socket.Port := 8080;
Socket.Connect;
if Socket.Connected then
begin
FileStream := TMemoryStream.Create;
try
FileStream.LoadFromFile(edtFileName.Text);
while not FileStream.EOS do
begin
ReadBytes := FileStream.Read(Buffer[0], Length(Buffer));
Socket.SendBuf(Buffer[0], ReadBytes, True);
end;
finally
FileStream.Free;
end;
ShowMessage('Файл успешно передан!');
end
else
ShowMessage('Не удалось подключиться к серверу.');
finally
Socket.Free;
end;
end;
end.
Сервер
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winapi.Sockets;
type
TForm2 = class(TForm)
btnListen: TButton;
procedure btnListenClick(Sender: TObject);
private
{ Private declarations }
FServerSocket: TTCPServer;
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.btnListenClick(Sender: TObject);
var
ClientSocket: TTCPClient;
FileStream: TMemoryStream;
Buffer: array[0..1023] of byte;
ReadBytes: integer;
FileName: string;
begin
FServerSocket := TTCPServer.Create(nil);
try
FServerSocket.OnExecute := ClientExecute;
FServerSocket.Active := True;
FServerSocket.Port := 8080;
except
on E: Exception do
ShowMessage(E.ClassName + ': ' + E.Message);
end;
end;
procedure TForm2.ClientExecute(AContext: TIdContext);
var
ClientSocket: TTCPClient;
FileStream: TMemoryStream;
Buffer: array[0..1023] of byte;
ReadBytes: integer;
FileName: string;
begin
ClientSocket := TTCPClient(AContext.Connection);
try
FileName := 'received_file.bin';
FileStream := TMemoryStream.Create;
try
while not ClientSocket.IOHandler.EOS do
begin
ReadBytes := ClientSocket.ReceiveBuf(Buffer[0], Length(Buffer));
FileStream.WriteBuf(Buffer[0], ReadBytes);
end;
FileStream.SaveToFile(FileName);
ShowMessage('Файл успешно получен: ' + FileName);
finally
FileStream.Free;
end;
finally
ClientSocket.Free;
end;
end;
end.
В данном примере клиентское приложение отправляет файл на сервер, используя TTCPClient, а серверное приложение принимает файл, используя TTCPServer. Для передачи данных используется буфер Buffer, в котором хранятся данные, считываемые из файла (клиент) или записываемые в файл (сервер).
Примечание: Перед запуском сервера убедитесь, что порт 8080 свободен и разрешена передача данных между компьютерами в вашей сети.
Вывод
Использование сокетов в Delphi позволяет реализовать прямую связь между приложениями без необходимости использовать FTP или другие промежуточные сервисы. В данном материале мы рассмотрели пример передачи файлов между компьютерами в разных сетях с помощью сокетов.
Материал описывает передачу файлов без FTP: использование сокетов в Delphi для прямой связи между приложениями через интернет без использования публичного IP-адреса.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.