![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| sunnmas |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
Имею Delphi 10Lite
Имеется платка, которая подсоединяется к компу по усб, эмулируя ком порт. Работать с ней умею. есть офис с несколькими компами, объединенных в локалку. Есть приложение, которое может использоваться с данной платкой. Сейчас если кто-то хочет поработать должен брать плату и подсоединять к своему компу. Так она кочует с компа на комп. Нужно сделать так, чтобы она была подключена к какому либо компу. На этом компе запущен сервер, к которому будут подключаться другие через tcp и работать с железом. В этой версии дельфи есть компоненты TTCPServer/Client. Встречаю скудные примеры по работе с данными компонентами. Все они сводятся к тому, что в обработчике события OnAccept сервера читаем сообщение от клиента и шлем ему ответ, далее выход из обработчика - приводит к закрытию соединения. Нужно сделать как-то так чтобы после подключения клиента запускался цикл ожидания команд от клиента для платы и полученные команды отсылались ей, принимались данные от платы и обратно отправлялись ответы от нее клиентам(клиент использует те же команды, как если бы он общался через ком порт, только шлет и принимает их по сети). Серверу должен быть не важен характер данных для того чтобы можно было менять протокол оконечный софт - плата без затрагивания кода сервера в будущем. Он просто принимает, что прислал клиент и пишет в плату, читает ответ и передает назад. Обычно один сеанс связи клиент - плата состоит из множества команд обмена. Поэтому цикл сервера должен быть готов принимать множество пакетов и отсылать ответы платы обратно. Так же как то нужно прерывать этот цикл с помощью клиента. Например клиент делает дисконнект и сервер выходит из цикла, ожидая следующего подключения клиента - следующего сеанса, состоящего из множества команд. Так же выход из цикла по таймауту. Реально это замутить в обработчике OnAccept? Не могли бы вы набросать примерный вид этого обработчика. Надеюсь на посильную помощь. Спасибо |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 6 Всего: 72 |
Попробуй воспользоваться моим примером (не сочти за саморекламу, но работа с "низкоуровневыми" сетевыми компонентами - достаточно нетривиальная задача).
|
|||
|
||||
| sunnmas |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
далеко от моего вопроса. Но все равно спасибо
|
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
||||
|
||||
| sunnmas |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
на сколько мне известно это бесплатная студенческая версия порезанная. поэтому и юзаю ее, т.к. в офисе пописываю. Но вообще предыдущее высказывание не понятно мне. Да и не по теме |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 6 Всего: 72 |
Почему? Я предлагаю воспользоваться для передачи по сети готовым решением, в котором учитываются многие проблемы, возникающие при использовании TCP. На "перворазном" этапе работы подобные "неявности" и "недоговоренности" приведут к неверному проектированию программы, заставят использовать ненужные костыли и так далее и тому подобное. Причем - на этапе тестирования, когда сервер и клиент расположены на одном компьютере, неучтенные проблемы однозначно не будут выявлены. А когда программа перейдет в стадию апробации на рабочих местах, начнут появляться всякие глюки, причину которых понять будет весьма непросто. |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 6 Всего: 58 |
какая какая версия? =) тут она есть? Это сообщение отредактировал(а) Keeper89 - 2.4.2011, 23:16 |
|||
|
||||
| cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: нет Всего: 15 |
Во-первых, скажу что неплохо внимать советам которые дают на форуме опытные камрады. Всё, о чём писал kami, является действительно актуальным!. Во-вторых, если дейстыительно хочется изобретать велосипед, то проблемы тоже не вижу. Например, берём любую демку чата, из состава делфи 5-7, и смотрим как реализован обработчик OnAccept. Это сообщение отредактировал(а) cat512 - 3.4.2011, 14:31 |
|||
|
||||
| sunnmas |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
прогресс вреде есть с компанентами инди 10.
Но и проблемы тоже имеются. Вот рабочий кусок кода (он в сокращении выложен. оставлены только ключевые моменты): клиент: TcpCli:=TIdTCPClient.Create(nil); TcpCli.Port:=3006; TCPCli.ReadTimeout:=1000; TCPCli.UseNagle:=false; ... TCPCli.Host:=NOD; TcpCli.Connect; if not TcpCli.Connected then begin LOG.WriteString(' TcpCli not connected to server'+#13#10); exit; end; ... try TCPCli.IOHandler.WriteBufferOpen; TCPCli.IOHandler.Write(FWrBuf); -шлю 1 байт TCPCli.IOHandler.WriteBufferClose; except on E: EIdException do begin LOG.WriteString('WriteBuffer failed. exception: '+E.Message+#13#10); Result:=false; end else begin LOG.WriteString('WriteBuffer failed. Fuck, Shit!'+#13#10); Result:=false; end; end; сервер procedure TMainForm.IdTCPServerExecute(AContext: TIdContext); var buf: array[0..100] of byte; begin try with AContext.Connection do begin try Dongle.FWrBuf.Clear; try IOHandler.ReadStream(Dongle.FWrBuf,1); принимаю 1 байт except end; if Dongle.FWrBuf.Size>0 then begin //пишем данные в плату if not Dongle.WriteBuffer then exit; end; //читаем данные из платы Dongle.FRdBuf.Clear; Dongle.ReadBuffer; if Dongle.FRdBuf.Size>0 then begin //отправляем ответ от платы клиентской программе IOHandler.WriteBufferOpen; IOHandler.Write(Dongle.FRdBuf); IOHandler.WriteBufferClose; exit; end; except end; end; finally end; end; Вот так все работает Но нужно двигаться дальше. Отсылать серваку не 1 байт, а произвольное их количество Для этого на сервере изменяю так: ... with AContext.Connection do begin try Dongle.FWrBuf.Clear; IOHandler.ReadTimeout(50); try IOHandler.ReadStream(Dongle.FWrBuf); except end; ... ставлю на сервере usenagle=false при этом IOHandler.ReadStream не зависает, но и не принимает никаких данных (от клиента все так же шлю пока 1 байт) Недогоняю пока в чем проблема. Подскажите? |
|||
|
||||
| sunnmas |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 17.4.2009 Репутация: нет Всего: нет |
Кстати при использовании TIdLOGFile
у клиента: Sent 12.04.2011 0:24:31: у сервера: Recv 12.04.2011 0:24:31: там после двоеточия дет квадратик(типо неотображаемый символ я полагаю) По сему на сервер данные поступают, но в поток Dongle.FWrBuf этот байт не записывается! как быть? |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
sunnmas, а что, кнопку КОД не судьба использовать?
http://forum.vingrad.ru/forum/topic-126445.html Добавлено через 3 минуты и 21 секунду нужно ведь как-то серверу сообщить, сколько ты байт отправляешь? |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |