Консультация № 184655
02.12.2011, 21:51
100.00 руб.
0 3 1
Здравствуйте! У меня возникли сложности с такой программой.
Требуется написать приложение клиент и приложение сервер на DELPHI 7 с использованием протокола TCP и стандартного модуля WINSOCK в DELPHI. Клиент отправляет файлы(только файлы, если в директории каталоги - их игнорируем) из директории на сервер с указанием пути к директории.
Сервер сохраняет файлы в какой либо директории и в текстовом файле сохраняет путь к директории клиента, в которой хранятся файлы клиента. Клиент Отправляет запрос на восстановление данных с указанием пути к директории. Сервер возвращает файлы.
Я немного начал работу. Не совсем понимаю как передать файлы. Буду РАД ЛЮБОЙ ПОМОЩИ ИЛИ СОВЕТУ. Заранее благодарю.

Обсуждение

Неизвестный
02.12.2011, 21:54
общий
приложения
Прикрепленные файлы:
a321beefe3023efd430a27c06c40b64d.rar
Неизвестный
07.12.2011, 02:05
общий
Вот две очень простые статьи про работу с сокетами на дельфи:
часть 1
часть 2
Чтобы отправить файл, читаете его в бинарном формате в память, желательно кусками по какое-нибудь разумное число байт, и отправляете посредством сокета эти данные. А на той стороне сохраняете их.
Не работала никогда с сокетами в дельфи, только в С++, но попробую разобраться, если Вы не справитесь.
В Вашем коде сейчас есть рациональное зерно, но сейчас там не предусмотрено даже соединение с сервером (он у Вас не ставится на прослушку и не обрабатывает подключение к нему).
Неизвестный
08.12.2011, 00:35
общий
это ответ
Здравствуйте, Невалёный В.!
Вот пример передачи файла. К интерфейсу привязка минимальная, это Вы и сами сможете сделать.
Сервер:
Код:
 var
Form1: TForm1;
WSA:TWSADATA;
Sock, lst_sock:TSocket;
addr:TSockAddr;

implementation

{$R *.dfm}

procedure serversocket;
begin

WSAStartup(MakeWord(1, 1), WSA);
sock := socket(PF_INET, SOCK_STREAM, 0);
addr.sin_family := PF_INET;
addr.sin_port := htons(2222);
addr.sin_addr.s_addr := INADDR_ANY;
bind(sock, addr, sizeof(addr));
listen(sock, SOMAXCONN);
end;

procedure TForm1.Button1Click(Sender: TObject); //кнопка Запустить сервер
begin
serversocket;

end;

procedure SaveFile (filename: string);
var f: file;
buf: array [1..256] of byte;
k, s, c: integer;
begin
assign (f, filename);
rewrite (f, 1);
recv (lst_sock, c, sizeof(c), 0); //получаем размер файла
k:= 1; s:= 0;
while (k>0) and (k<>SOCKET_ERROR) and (s<c) do //пока читается и не достигнут размер файла
begin
k := recv (lst_sock, buf, sizeof(buf), 0); //читаем блок
s:= s+k; //суммируем длину
if (k>0) then BlockWrite (f, buf, k); //пишем в файл
end;
close (f);
end;

procedure TForm1.Button2Click(Sender: TObject); //кнопка Ожидать клиента
begin
lst_sock := accept (sock, nil, nil); //ожидание подключения
ShowMessage('Подключен клиент');
SaveFile ('C:\socket');
end;

Клиент:
Код:
var
Form1: TForm1;
s:TSocket;
WSA:TWSAData;
addr:TSockAddr;
implementation

{$R *.dfm}


procedure SendFile(filename:string); //отправляем файл
var
MyFile : file;
buf: array [1..256] of byte;
k: integer;
begin
assign (myfile, filename);
reset (myfile, 1);
k:= FileSize(myfile); //получаем размер
send (s, k, sizeof(k), 0); //шлём размер
repeat
BlockRead (myfile, buf, sizeof(buf), k); //читаем блок
if (k>0) then send (s, buf, k, 0); //шлём блок
until k=0;
close (myfile);

end;

procedure CloseConnection;
begin
CloseSocket(s);
WSACleanup;
end;

function TForm1.InstallConnect : boolean;
begin
WSAStartup(MakeWord(1, 1), WSA); //создаем сокет
s := Socket(PF_INET, SOCK_STREAM, 0);
addr.sin_family := AF_INET;
addr.sin_port := htons(2222);//StrToInt (LabeledEdit2.Text));
addr.sin_addr.S_addr := inet_addr(PAnsiChar('127.0.0.1'));//LabeledEdit1.Text));
if (connect(s, Addr, SizeOf(Addr)) = SOCKET_ERROR) then begin
CloseConnection;
result:=false end
else result:=true;

end;



procedure TForm1.Button1Click(Sender: TObject); //кнопка Отослать
begin
SendFile ('C:\script.txt');
end;

procedure TForm1.BitBtn2Click(Sender: TObject); //кнопка Соединиться
begin
If InstallConnect then
ShowMessage('Соединение установлено')
else ShowMessage ('Не удалось установить соединение');

end;


Вам соответственно остаётся привязать к интерфейсу и сделать просмотр папки.
Удачи!
Форма ответа