Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2008, 00:22   #1
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию Передача файлов(exe) при помощи TCPServer и TCPClient

Долбился сутки, решил спросить у профессионалов.
отправка
Код:

procedure TForm1.Button2Click(Sender: TObject);
begin
Client.Open;
if od.Execute then
 begin
  MSC.LoadFromFile(od.FileName);
  msc.Position:=0;
  Client.Sendln(inttostr(msc.Size));
  Client.SendStream(msc);
 end;
 Client.Close;
end;
Дело в том, что отправляется не весь файл, а его часть.

Приём.
Код:
procedure TForm1.ServerAccept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var
  s,sl: string;
begin
s:=ClientSocket.Receiveln();

if not Reciving then //глобальная Reciving:boolean
 begin
  SetLength(sl,StrLen(PChar(s))+1);
  StrLCopy(@sl[1],PChar(s),Length(sl)-1);
  DataSize:=StrToInt(sl); //глобальная DataSize:Integer
  Data:=TMemoryStream.Create; //глобальная Data:TMemoryStream
  Delete(s,1,Length(sl));
  Reciving:=true;
 end;

try
 Data.Write(s[1],length(s));
 if Data.Size=DataSize then
  begin
   Data.Position:=0;
   data.SaveToFile('C:\123.exe');
   Data.Free;
   Reciving:=false;
   ClientSocket.Close;
  end;
except
 Data.Free;
end;

end;
Код:
Client.Sendln(inttostr(msc.Size)); - отправка размера файла
Client.SendStream(msc); - отправка файла
Я вот что не пойму, когда я создаю подключение (Client.active:=true) и передаю одну строку, сервер её принял. Потом не разрывая подключения, я не могу передать вторую строку, надо постоянно переподключаться
Код:
Client.Close;
Client.Open;
почему так? Или я что то не так делаю?

P.S. Алгоритмы передачи/приёма я взял из "ClientSocket и ServerSocket" (там всё потому что работает).

P.P.S Ни как не могу заставить сервер отправить файл (или наоборот клиента - принять) в обшем Stream я отправляю, а клиент не берёт?...
Всё гениальное - просто!

Последний раз редактировалось Air; 07.04.2008 в 00:25.
Air вне форума Ответить с цитированием
Старый 07.04.2008, 07:47   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Сам лично сколько не возился в свое время так и не понял как этот SendStream работает ))) Легче намного на api написать...
BOBAH13 вне форума Ответить с цитированием
Старый 07.04.2008, 21:54   #3
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Нда, а код не будет глупо выглядеть, если я сокеты добавлю?

На api ?
это как в теме "Передача файла через TServerSocket и TClientSocket", что ли? - это мне знакомо.
Просто почему TCPServer~Client, потому что у меня сервис, не маленький на нём основан и клиент.
Дело в том что к TServerSocket может подключиться только 1 клиент, а надо много.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 08.04.2008, 00:35   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Дело в том что к TServerSocket может подключиться только 1 клиент, а надо много.
Ерунда какая то ))) если не подводит память там свойство Connections где-то было... Тем более если сервер не маленький надо писать на более низком уровне ( моя точка зрения )
BOBAH13 вне форума Ответить с цитированием
Старый 08.04.2008, 11:20   #5
Vanya
Пользователь
 
Аватар для Vanya
 
Регистрация: 02.04.2008
Сообщений: 10
По умолчанию

ВОВАН13 ты прав в СерверСокет есть возможность работать с несколькими клиентами
Vanya вне форума Ответить с цитированием
Старый 08.04.2008, 11:52   #6
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Цитата:
Сообщение от Vanya Посмотреть сообщение
ВОВАН13 ты прав в СерверСокет есть возможность работать с несколькими клиентами
А как мне потом различить подключения 10.72.70.2(Index=0), 10.72.70.4(Index=1), 10.72.70.3(Index=2).
А если 10.72.70.4 отключится и подключится 10.72.70.10 то их "Index" будут в разнобой.
Тогда, мне кажется, придётся серверу постоянно перед отправкой рассылать спец.запрос для поиска IP-адреса и соответственного "Index".
Или из "Index" можно как-то IP-адрес узнать(только на сервере)?

Дошло, наверно при каждом подключении надо свой лист IP подключений формировать и сервер его будет изменять если кто-то отключается

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Ерунда какая то ))) если не подводит память там свойство Connections где-то было... Тем более если сервер не маленький надо писать на более низком уровне ( моя точка зрения )
Не сам компьютер-сервер, а программа-сервер.
Эта программа представляет собой сервис контроля, настройки и наблюдения за компьютером.
Я написал его специально, что б не бегать по всей школе и не настраивать одно и то же каждый раз(Ученики-хакеры-ломастеры)
Всё гениальное - просто!

Последний раз редактировалось Air; 08.04.2008 в 11:56.
Air вне форума Ответить с цитированием
Старый 26.12.2008, 23:26   #7
albatros
Пользователь
 
Регистрация: 09.05.2008
Сообщений: 39
По умолчанию

Короче, можно тупо поместить Timer
и повторять процедуру приёма
Непечатный жаргон - это тот язык, которым решительно все программисты владеют в совершенстве.
albatros вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[TcpClient, TcpServer] или [ServerSocket, ClientSocket] работа через прокси DOLBY Работа с сетью в Delphi 2 17.09.2009 05:46
Serversocket,clientsocket и TCPserver, TcpClient prizrak1390 Компоненты Delphi 2 04.02.2008 08:10
TcpClient и TcpServer DOLBY Работа с сетью в Delphi 5 17.12.2007 10:43
TCPServer и TCPClient Antoha Работа с сетью в Delphi 19 06.10.2007 12:01
Передача файлов wolff Работа с сетью в Delphi 3 03.03.2007 15:54