Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ServerSocket :: What are differents? [D7, WinXP]


Страницы:   1 2

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]

Это ошибки терминологии, они похожи внешни и ранее не делали разницы, на самом деле первый синхронный, а второй асинхронный.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо