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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2007, 08:52   #1
Pedro
Форумчанин
 
Аватар для Pedro
 
Регистрация: 25.03.2007
Сообщений: 166
По умолчанию Снова idtcp

Как отправить файл от idtcpclient'a на idtcpserver?
Pedro вне форума Ответить с цитированием
Старый 03.10.2007, 09:55   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Отправка:


procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var
FileToSend: String;
FileSize: Cardinal;
p: Pointer;
begin
FileToSend := 'c:\MSDOS.SYS'; // тут файл, который мы рассылаем любому попросившему.
with TFileStream.Create(FileToSend, fmOpenRead) do
try
FileToSend := ExtractFileName(FileToSend) + #00;
GetMem(p, 256);
try
CopyMemory(p, @FileToSend[1], Length(FileToSend));
AThread.Connection.Socket.Send(p^, 256);
finally
FreeMem(p);
end;
FileSize := Size;
AThread.Connection.Socket.Send(File Size, SizeOf(FileSize));
GetMem(p, Size);
try
ReadBuffer(p^, Size);
AThread.Connection.Socket.Send(p^, Size);
finally
FreeMem(p);
end;
finally
Free;
end;
AThread.Connection.Disconnect;
ShowMessage('Послано');
end;



Получение:

procedure TForm1.IdTCPClient1Connected(Sender : TObject);
var
FileName: PChar;
FileSize: Cardinal;
FS: TFileStream;
begin
GetMem(FileName, 256);
try
IdTCPClient1.ReadBuffer(FileName^, 256);
IdTCPClient1.ReadBuffer(FileSize, SizeOf(FileSize));
FS := TFileStream.Create('incoming\'+File Name, fmCreate); // тут создается файл, я его положил в каталог incoming
try
IdTCPClient1.ReadStream(FS, FileSize);
finally
FS.Free;
end;
finally
FreeMem(FileName);
end;
ShowMessage('Принято');
end;
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 03.10.2007, 11:05   #3
Pedro
Форумчанин
 
Аватар для Pedro
 
Регистрация: 25.03.2007
Сообщений: 166
По умолчанию

Спасибо Квэнди! Вот еще вопрос, как сделать чтобы сервер отправлял принятое сообщение(текст) от клиента, всем клиентам?
Pedro вне форума Ответить с цитированием
Старый 03.10.2007, 11:11   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Соединение с клиентом создается только в момент получения от него сообщения, соединение не держится
Для каждого соединения создается отдельный поток, поэтому внутри него мы не знаем есть ли сейчас текущие активные соединения.
Выход один: хранить где- то массив клиентов ( IP адреса) и по получении в цикле отправлять на эти адреса сообщения
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 03.10.2007, 11:32   #5
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
Соединение с клиентом создается только в момент получения от него сообщения, соединение не держится
Для каждого соединения создается отдельный поток, поэтому внутри него мы не знаем есть ли сейчас текущие активные соединения.
Выход один: хранить где- то массив клиентов ( IP адреса) и по получении в цикле отправлять на эти адреса сообщения
либо использовать UDP , вместо TCP ....
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp
Pitbull вне форума Ответить с цитированием
Старый 03.10.2007, 18:57   #6
Pedro
Форумчанин
 
Аватар для Pedro
 
Регистрация: 25.03.2007
Сообщений: 166
По умолчанию

Вы не могли бы привести код. Заранее благодарен.
Pedro вне форума Ответить с цитированием
Старый 04.10.2007, 15:20   #7
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Какой именно код ?
в Onconnect на Tcpserver сохраняешь IP адрес клиента, который к тебе подсоединился, доступный в athread.Connection.Socket.Binding.P eerIP

затем в onexecute идешь по массиву сохраненных ip адресов и отправляешь свое сообщение
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 10.05.2008, 15:31   #8
SeЯgey
Пользователь
 
Регистрация: 03.04.2008
Сообщений: 50
По умолчанию

Квэнди, можно показать код отсылки файла по сохраненным ip адресам
и еще вопрос клиент автоматически подсоединяются к серверу т.е. запускаются программы и клиенты подсоединяются, сервер сохраняет в массив ip адреса и передает файл всем клиентам.


заранее большое спасибо

Последний раз редактировалось SeЯgey; 10.05.2008 в 16:11.
SeЯgey вне форума Ответить с цитированием
Старый 11.05.2008, 02:06   #9
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

проверяйте какой в AThread.Connection.Socket ip адрес и делайте вывод отправлять или нет.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 12.05.2008, 13:56   #10
SeЯgey
Пользователь
 
Регистрация: 03.04.2008
Сообщений: 50
По умолчанию

можно еще вопрос. Передовать файлы в обе стороны возможно или необходимо на обе программы прописывать и клиента и сервер.
Если нет как передать от клиента к серверу?
SeЯgey вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Снова StringGrid zzzzz Компоненты Delphi 2 13.07.2008 01:41
Снова о массиве Constellation Общие вопросы Delphi 2 09.02.2008 20:42
И снова Chart SunKnight Общие вопросы Delphi 5 08.02.2008 11:58
и снова Mdi Баламут Общие вопросы Delphi 1 28.11.2006 07:03