![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ServerSocket :: What are differents? [D7, WinXP]
Alexey (AZ) © (2006-11-13 13:01:00)servertype - тип сервера. Может принимать одно из двух значений: stnonblocking - синхронная работа с клиентскими сокетами. При таком типе сервера Вы можете работать с клиентами через события onclientread и onclientwrite. stthreadblocking - асинхронный тип. Для каждого клиентского сокетного канала создается отдельный процесс (thread).
Добрый день. Сразу введу в курс дела. Нужен сервер, к которому могут только подключаться и отправлять инфу, отключением клиентов занимаюсь я. Есть идея сделать по таймеру так...
for i:=1 to Serv.Socket.ActiveConnections do
Memo1.Text := Serv.Socket.Connections[i-1].ReceiveText;
...и считывать с клиенов их послания так, а НЕ через событие ClientRead, затем отключать. Вопросы:
1) Будет ли накапливаться где-то инфа, если клиент отключится до того как я считаю (после дисконнекта я считать не смогу)?
2) Какой размер этого буфера?
3) СтОит ли копать в сторону stBlocking? Если да, то на что обратить внимание? (сейчас стоИт stNonBlocking)
Благодарю за внимание.
Сергей М. (2007-02-27 10:52:00) [1]
> SocketStream уже будет уничтожен?
Нет.
Уничтожение стрима - это явныйвызов тобой метода TWinSocketStream.Free. Пока ты не вызвал этот метод, стрим продолжает существовать.
Alexey (AZ) (2007-02-27 10:04:00) [2]Понятно, а если таймаут = 1 секунде, я вычитал из порта всё тчо надо и затем идёт операция обработки данных (5 секунд) и мне нужно отправить данные обратно, то SocketStream уже будет уничтожен?
Сергей М. (2007-02-26 10:31:00) [3]
> Какой смысл имеет TimeOut?
Время (в миллисекундах), не более чемна которое будет блокироваться нить, вызывающая методы Read[Buffer], Write[Buffer] при любом (успешном или неуспешном) исходе запрашиваемой операции чтения/записи.
Простой пример:
Таймаут = 1000 (1 секунда)
Принимающая сторона запрашивает к чтению из потока, скажем, 10 байт.
Если в течении не более секунды во вх.потоке окажутся доступными для чтения неменее чем 10 байт, метод Read[Buffer] вернет управление с результатом 10
Если по прошествии секунды во вх.потоке окажутся доступными менее 10 байт, метод Read вернет управление с результатом < 10, а метод ReadBuffer возбудит исключение EReadError
medved_68 (2007-02-26 08:54:00) [4]
> Время жизни потока в ожидании данных или время жизни потока
> вообще? Не понимаю...
Время жизни потока при отсутствии активности сокета.
Alexey (AZ) (2007-02-23 21:37:00) [5]И ещё один вопрос.
Stream := TWinSocketStream.Create(ClientSocket, TimeOut);
Какой смысл имеет TimeOut? Время жизни потока в ожидании данных или время жизни потока вообще? Не понимаю...
Alexey (AZ) (2006-11-29 13:27:00) [6]Сергей М., благодарствую за разъяснения!
Сергей М. (2006-11-27 08:30:00) [7]
> Т.е. мне некогда ждать, пока заполнится буфер
На то существует неблокирующий режим.
Но в Инди он не реализован по ряду важных причин.
Зато реализован в TServer/ClientSocket.
> Как в TServerSocket. Он же может съесть всё с порта, а если
> там ничего нет, то он и съест ничего, но висеть на этой
> инструкции не будет.
Сказанное справедливо только для неблокирующего режима.
Alexey (AZ) (2006-11-24 20:44:00) [8]Возможны 2 варианта работы: клиент подключился, отправил, отключился. Надо собрать с порта до того как он отключится. И ещё: клиент подключился, отправил, получил ответ, я его отключил.
Alexey (AZ) (2006-11-24 20:22:00) [9]Нашел ещё статью.
http://www.codenet.ru/progr/delphi/stat/TServerSocket.php
По инди: если я понятия не имею о том, что мне будут отсылать, то как считать всё что есть порте? Т.е. я не знаю ни размер отправляемых мне данных, ни их terminator char (в общем понятно). Вот шлют мне бинарную херь, требующую немедленной обработки, и что тогда? Т.е. мне некогда ждать, пока заполнится буфер.
> Как ты себе видишь работу этих методов ?
Как в TServerSocket. Он же может съесть всё с порта, а если там ничего нет, то он и съест ничего, но висеть на этой инструкции не будет.
Сергей М. (2006-11-24 08:12:00) [10]
> Alexey (AZ) (23.11.06 20:56) [19]
А почему он не должен "висеть" ?
Как ты себе видишь работу этих методов ?
Alexey (AZ) (2006-11-23 20:56:00) [11]Позвольте тогда вопрос: какого Connections.readln либо connections.readstring(1) (или как там его) висит, если в порте нет данных?
Anatoly Podgoretsky (2006-11-23 19:43:00) [12]> Alexey (AZ) (23.11.2006 19:15:17) [17]
Клиент ничего не знает про сервер, даже на какой ОС он реализован и чем. Это базовое правило сетей.
> 1. Плохо то, что для ReadLn и т.п. надо указывать "символы конца строки",
Почему плохо, как раз наоборот, позволяет работать с любой ОС
> 2. можно ли как вариант создавать на каждый трэд по ADOQuery с DataSource'м и соединять их на единственный ADOConnection?
Можно, но стоит подумать и об создании ADOConnection в потоке, иначе у тебя по сути получится однопотоковое приложение, через единственный ADOConnection они будут только последовательно обрабатываться.
Alexey (AZ) (2006-11-23 19:15:00) [13]Сергей М. © (13.11.06 15:21) [9] , thx!
Ужос с потоками. Оказалось что для клиента есть разница какой на сервере сокет. И похоже, что клиент работает в неблокирующем. Думаю выбрать indy как замену T[X]Socket.
У меня остались вопросы:
1) В IdTCPServer есть ReadString(X) (или типа), читающий X знаков, и есть ReadLn. Плохо то, что для ReadLn и т.п. надо указывать "символы конца строки", либо кол-во байт. А есть ли что-нибудь типа ReceiveText как в (T[X]Socket), дапбы собрать с порта всё что есть?
2) Если у меня на форме есть ADOConnection и ADOQuery с DataSource'м, а я собираюсь делать потоки, то можно ли как вариант создавать на каждый трэд по ADOQuery с DataSource'м и соединять их на единственный ADOConnection?
Может быть есть другие способы, самому наступать на грабли просто некогда, м.б. присутствуют наступившие и расскажут новичку как надо :)
Anatoly Podgoretsky © (13.11.06 15:30) [10] , посмотрел Ваш перевод книги про indy. К сожалению автры мало рассказали о сервере, работающем на OnExecute (вместо этого внимание уделено командному режиму).
Сергей М. (2006-11-17 09:10:00) [14]
> Alexey (AZ) (16.11.06 16:36) [12]
Понятно.
Пробуй stThreadBlocking.
DVM (2006-11-16 16:54:00) [15]
> У нас особый формат команд (фактически придумали протокол).
> В зависимости от этих команд моя прога формирует запросы.
> .. вот так и работает.
Велосипед изобрели. Советую все-таки почитать про многоуровневые приложения в Delphi, может окажется, что подойдет.
Alexey (AZ) (2006-11-16 16:51:00) [16]Я пользуюсь ADOConnection, ADOQuery & DataSource. У нас особый формат команд (фактически придумали протокол). В зависимости от этих команд моя прога формирует запросы... вот так и работает.
DVM (2006-11-16 16:41:00) [17]
> Функции проги следующие: принимать от юзеров команды, выгребать
> БД и отсылать мегабайты обратно
По моему это трехуровнеая схема. В Делфи уже реализовано.
Alexey (AZ) (2006-11-16 16:36:00) [18]Сергей М. © (13.11.06 15:21) [9]
> Стоит, если транспортный тред не будет заниматься ничем
> иным, как только приемом/передачей
Моей задачей является написание сервера, работающего с БД и управляемого с помощью потоконебезопасных VCL. Функции проги следующие: принимать от юзеров команды, выгребать БД и отсылать мегабайты обратно. Иногда логировать в Мемо и т.п.
Anatoly Podgoretsky (2006-11-13 15:31:00) [19]> DVM (13.11.2006 15:17:08) [8]
Тогда и у меня наоборот.
--
Anatoly Podgoretsky (2006-11-13 15:30:00) [20]> DVM (13.11.2006 15:15:07) [7]
Это ошибки терминологии, они похожи внешни и ранее не делали разницы, на самом деле первый синхронный, а второй асинхронный.