![]() |
|
![]() ![]() ![]() |
|
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Долго пытался разобраться, но, ну никак, не получается. Разбираюсь в Indy 10, Builder 2007
Суть - есть сервер, есть клиенты. Клиенты приконнектились, и просто сидят ждут, когда сервер в ему угодное время отправит что-либо. Так вот. Как клиентом серверу сообщения посылать я понял, а вот как сервер клиенту должен послать я так и не понял. Большая просьба помчь строчкой кода ввиде примера. |
|||
|
||||
SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
Client ----->>>>> "OK" Server ------->>>>> "NoOK" ====================== Сервер посылает в созданном потоке (при соединении с клиентом) ответ.... Это сообщение отредактировал(а) SVN74 - 29.3.2009, 00:03 |
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Допустим, я могу сразу ответить клиенту например так:
но как я смогу ответить вне функций ОнКоннект и ОнЭкзекьют, ведь там-то у меня не будет передаваемого *AContext? Ну в смысле, где в объекте TIdTCPServer хранятся указатели на подключенных клиентов? За ранее пасибо! |
|||
|
||||
SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
Вот отдельное событие (отдельный поток)
==================================================== void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext) { try { Тут обслуживаем клиента, если надо сделаем задержку } __finally { AContext->Connection->Disconnect(); } } |
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Как из функции Execute и других у объекта IdTCPServer сделать ответ клиенту я понял, ну а как это сделать скажем из функции Баттон1? Или ты хочешь сказать что это не возможно и нужно делать задержки в функции экзекьют? Это же такое геморрой ![]() Добавлено через 6 минут и 12 секунд Допустим в TcpServer's инфа о подключенных хранилась в TcpServer->Socket->Connections[index], неужели нет аналога у IdTCPServer? |
|||
|
||||
SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
Да, нужно делать задержку для клиента, (правда, если количество клиентов не очень большое), а Button1 -> это общий ресурс, соответственно в потоке TForm1::IdTCPServer1Execute (через синхронизацию) просто надо отслеживать изменения состояния (к примеру) глобальной переменной и делать определенные выводы и причем это не затронет основной поток, и не будет видно ни каких задержек... |
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Ладно, попытаюсь реализовать... хотя назвать это удобным, мегко говоря, не получается.
И еще вопрос - если допустим у меня 4и клиента находяцца на коннекте (из функции Экзекьют я уже вышел) и мне надо его отдесконектить, то как обраться именно к 3ему клиенту и скачать ему "пока"? Это сообщение отредактировал(а) CaLaT - 29.3.2009, 12:50 |
|||
|
||||
SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
Попробуй так:
=================== AContext->Connection[0].IOHandler->WriteLn("Bla, Bla"); =================== Можно еще так: ========================== IdTCPServer1->Bindings->Items[0]->Collection->Count; IdTCPServer1->Bindings->Items[0]->........ ========================== Надо пробовать всевозможные варианты... ================================================== Вообще лучше использовать WinSock (без гмр.) Это сообщение отредактировал(а) SVN74 - 29.3.2009, 17:51 |
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Пытался работать с этим в си и у меня не получается привести Server->Contexts->LockList()->Items[0] (void*) к типу TIdContext... есть мысли? Это сообщение отредактировал(а) CaLaT - 30.3.2009, 08:45 |
|||
|
||||
CaLaT |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Сделал так:
И вот только теперь я заметил что у объекта TIdTCPClient нет метода OnRead() или OnReceive(). Каким образом мне понять что сервер что-то засылает? пс: я надеюсь, для этого не потребуется в цикле проверять Добавлено через 3 минуты и 4 секунды Просьба не предлогать проверять в ручную, всё таки эта будет лишняя нагрузка, которая кленту не нужна |
||||
|
|||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
||||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
К сажелению событие ОнВорк несрабатывает... вообще никогда. Хотя если вручную проверить, то сообщение отправленное сервером на сокете есть.
Это сообщение отредактировал(а) CaLaT - 30.3.2009, 22:03 |
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Даже ОнСтатус возвращающий стринги с текущими действиями не реагирует на сообщения от сервера
|
|||
|
||||
SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
WinSock просто и надежно...
|
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Так и не нашёл...
Пришлось реализовать через tplower поток, который мониторит сокет на появление данных Еще вопрос: При передачи достаточно больших файлов, хотелось бы юзеру сообщать об общем ходе передачи на стороне клиента. Нашёл переменную - WriteBufferThreshhold , которая по идеи и должна возвращать желанное. Но получаю почему-то только -1. |
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Передачу делаю так:
До передачи организую отдельный поток, который должен считывать сколько передано, но... TransmiteFile->Position всегда на конечном кол-во байт, (т.е =TransmiteFile->Size) а если Position в ручную обнулить перед передачей, то он всегда будет 0 Client->Socket->WriteBufferThreshhold всегда = -1 Помогите пожалуйста! Может я что-то делаю не так, или не то? Это сообщение отредактировал(а) CaLaT - 15.4.2009, 08:48 |
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Может попробовать разбивать Мэмористрим на небольшие части и отправлять их частями? сколько частей будет я знаю и знаю по сколько эти части...
Блин, чото это на изобретение велосипеда тянет... мож таки есть другие решения? ...мысли? Это сообщение отредактировал(а) CaLaT - 18.4.2009, 11:05 |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
хотя я и не профи в Indy...
Не совсем понял, почему вы отправляете файл именно так. Есть же метод WriteStream. Но это в 8-ой версии. 10-я вроде как претерпела большие изменения. Так что может вы и правы.
Наверное, это единственный выход... -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
artsb |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Это можно делать где угодно. Например, в Button1Click:
Естественно, не забываем про try catch. А событие OnWork наступает, когда происходит запись или чтение данных. AWorkMode показывает, что сейчас происходит (запись или чтение), а AWorkCount содержит количество переданных/прочитанных байт. Событие OnBeginWork наступает перед записью/чтением. AWorkMode показывает, что сейчас происходит (запись или чтение), а AWorkCountMax в случае чтения, содержит количество байт, которые будут приниматься. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||
|
|||||
CaLaT |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Ох и замучался я с этой десяткой(
Всё верно, но только не для 10ой инди( Её переработали( По описанию так и должно быть, но проблема с том, что событие ОнВорк() вообще не срабатывает. Я даже пытался его прораммно вызывать:
В это случаи функция ОнВорк Срабатывает, но вызывается единожды... Как только не пробовал( |
||||||
|
|||||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Странно, у меня срабатывает... ЗЫ видать 10-ка серьёзные изменения притерпела... -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |