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

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

TSocketClient и TSocketServer работа с потоками


Страницы:   1 2 3

Vladimir ©   (2009-03-01 10:27:00) 

Доброго времени суток всем! Заранее извиняюсь если данная тема уже поднималась, но в поиске ответа на свой вопрос я так и не нашел. Требуется написать клиент-серверное приложение. В данный момент написал пробные клиент и сервер на SocketClient и SocketServer соответсвенно работающие в синхронном режиме. Подскажите пожалуйста каким образом  организовать их работу в асинхронном режиме, чтобы сервер одновременно обслуживал несколько клиентов! И ещё есть такая проблема при посылке текста через SendText на сервер приходят иероглифы, причем  это только на Windows Vista, на Windows XP все работало нормально. Использую Delphi 2009. Из-за чего это может быть? Заранее спасибо.


Сергей М.   (2009-05-08 20:05:00) [1]


> это для обычного режима


Для какого такого "обычного" ?
Где ты узрел в ДОКУМЕНТАЦИИ фразу "обычный режим" ?
И блокирующий и неблокирующий режимы являются "обычными", иных режимов у этих компонентов попросту нет.
Для любогоиз этих режимов упомянутые методы применимы.


> в той процедуре клиентского потока что тогда делается?


Там осуществляются циклические попытки чтения из потока.


Zalm   (2009-05-08 18:31:00) [2]

это я использовал, это для обычного режима, а в той процедуре клиентского потока что тогда делается?....(


Сергей М.   (2009-05-07 12:56:00) [3]


> как принимать на сервер


ClientSocket.ReceiveText/Buf


> отправлять с сервера


ClientSocket.SendText/Buf/Stream

Что тут не понятного ?


Zalm   (2009-05-07 12:47:00) [4]

ну да, у клиента-то есть... а как принимать на сервер, и отправлять с сервера я пока  из нашего разговора не понял(


Сергей М.   (2009-05-05 08:42:00) [5]


> Socket  у меня


Сокет - объект, предназначенный для выполнения коммуникационных функций транспортногоуровня. А строки - это уже прикладной уровень, сокет о них ничего не знает, ибо это не его задача.


> откуда тогда брать строку?
>


А откуда она возьмется, эта строка, прежде чем ее "брать" ?


> ниче с этим потоком не понимаю


Ну и не используй его, если "грю ниче не понимаю") ..Никто ж не заставляет ..

У объекта, представленного св-вом ClientSocket, есть знакомые тебе по неблок.режиму методы ReceiveText/Buf, SendText/Buf - их и пользуй


Zalm   (2009-05-04 23:05:00) [6]

да, это я всё знаю, почти все эти протоколы, только не понял снчала что спрашивается)) Socket  у меня.


> Ну и какую строку "оттуда", т.е. из ac, ты собрался "взять"
> ?

Ну а откуда тогда брать строку?

я ж грю я ниче с этим потоком не понимаю :(


Сергей М.   (2009-05-03 21:45:00) [7]


> а вот это?


Ну и какую строку "оттуда", т.е. из ac, ты собрался "взять" ?


> не понял


Что ты не понял ?
HTT P, FT P, SMT P, SNM P, BG P, SC Pи т.д. и т.п. - слышал когда-нить хоть краем уха эти аббревиатуры ?
Все это - протоколы информационного обмена.
Каждый из них устанавливает определенные соглашения и правила, по которым партнеры по соединению "разговаривают" между собой.
Посылая, скажем, сообщения в эту конференцию и получая из конференции сообщения, твой клиент-браузер обменивается с сервером сообщениями в соответствии с протоколом HTTP.

А у тебячто за протокол ?


Zalm   (2009-05-03 20:42:00) [8]

почему ахинею-то?

а вот это?


ac : integer;

                   readlen := fSocketStream.read( fRequest[ac], 1024 );
                   ac := ac+readlen;



> Протокол информационного обмена, может, соизволишь представить
> ?


не понял


Сергей М.   (2009-05-02 21:07:00) [9]


> появился евент и поехали
> обрабатывать


Ну а если нет этого самого "евента" ? Чем занята в отсутствие "евентов" твоя программа ? Нашиша, спрашивается , было задействовать stThreadBlocking ? Ради моды что ли ?


> я их всегда жду


Почему ?
Протокол информационного обмена, может, соизволишь представить ?


> мы же в ac складываем integer, как потом оттуда строку взять?


О боже ..

Что за ахинею ты несешь ?


Zalm   (2009-05-02 19:04:00) [10]


> А что бы изменилось, если бы был неблокирующий режим ?

В обычном режиме всё просто, пришло что-то, появился евент и поехали
обрабатывать, а тут ниче не ясно.

> В момент когда вы, в соответствии с вашим прикладным протоколом
> информационного обмена, ждете от партнера по соединению
> некие данные.

я их всегда жду))) Этот поток же ничего не сделает сам когда придут данные

и еще, мы же в acскладываем integer, как потом оттуда строку взять?))


Сергей М.   (2009-05-01 21:42:00) [11]


> как это никакого?


Да вот так - никакого и всё тут)


> К какой момент мы что-то читаем из буфера


В момент когда вы, в соответствии с вашим прикладным протоколом информационного обмена, ждете от партнера по соединению некие данные.

А что бы изменилось, если бы был неблокирующий режим ?


> и тд


Конкретнее ..


Zalm   (2009-05-01 18:45:00) [12]


> А какое отношение это имеет к режиму ? Никакого абсолютно.

как это никакого? у меня вобще проблема с пониманием этой процедуры, как она работает, то ли там крутится вечно в цикле, то ло еще не пойми как.
К какой момент мы что-то читаем из буфера и тд... :(


Сергей М.   (2009-05-01 14:24:00) [13]


> а как прочитать одну комманду?


А какое отношение это имеет к режиму ? Никакого абсолютно.


> можно и на следующий запрос взезть


Ну и что ? "Остаток", если он был обнаружен, никуда не пропал, если ты его, конечно, не выбросил собственноручно.. При следующем чтении к "остатку" приклеишь то что будет в очередной раз прочитано


> переменную ас чем надо инициализировать?


Ты же ее ужепроинициализировал

> ac := 0;


Zalm   (2009-04-30 23:59:00) [14]

так а как прочитать одну комманду? если читать по 1024 сразу то можно и на следующий запрос взезть...

То есть то что я отправлю через сенд текст с клинета, прилетит на сервер как раз в тот самый СокетСтрим?

а переменную ас чем надо инициализировать?


Сергей М.   (2009-04-30 20:34:00) [15]


> а что тут тогда делается?


Здесь предпринимается попытка чтения  очередных 1024 байт из потокавходящих данных. Никакими пакетами здесь даже не пахнет.


> sendtext точно так же и работает с клиента?


sendtext'у абсолютно фиолетово ктоее вызывает.
sendtext предпринимает попытку отправки некимх данных партнерупо соединению.
Для клиентов партнером является сервер, для сервера партнерами являются клиенты.


Zalm   (2009-04-30 20:27:00) [16]


> Что "всё" ? По каким таким "пакетам" ?

ну а что тут тогда делается?
readlen := fSocketStream.read( fRequest[ac], 1024 );


> Клиент не может ничего знать о режиме сервера


то есть sendtext точно так же и работает с клиента?


Сергей М.   (2009-04-30 08:34:00) [17]


> REQUESTSIZE какое значение присвоить?


Размер буфера, который ты нулями заполняешь.


> тут всё как-то по пакетам


Что "всё" ? По каким таким "пакетам" ?


> клиет будет для такого блокирующего ервера


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


Zalm   (2009-04-29 20:27:00) [18]


Procedure CServerThread.ClientExecute;
var
REQUESTSIZE : integer;
fRequest : array [0..1024] of char;
ac,readlen : integer;
begin
try
  fSocketStream := TWinSocketStream.Create( ClientSocket, 1000 );
  try
    while ( not Terminated ) and ( ClientSocket.Connected ) do
      try
         FillChar( fRequest, REQUESTSIZE, 0 );
         ac := 0;
         repeat
          readlen := fSocketStream.read( fRequest[ac], 1024 );
          ac := ac+readlen;
         until
         (readlen = 0) or (ac = REQUESTSIZE);
      except
        on e:exception do
        begin
          ClientSocket.Close;
        end;
      end;
  finally
    fSocketStream.Free;
  end;
except
  on e:exception do
  begin
    ClientSocket.Close;
  end;
end;
end;


С исправлениями будет так, а REQUESTSIZE какое значение присвоить?


> "Три штуки"  - стаж как-никак солидный)

ну они ж простые, два совсем примитив, а другой сервер и клиент, подобие аси)) почти всё шикарно, только один косяк, не блокирующий режим лепит запросы в один... лень стало испрвлять, вот как пойму как с этими потоками писать буду нормальный писать. Могу отправить если хотите посмотреть что он из себя представляет))


> Значит пора прекращать задавать откровенно дилетантские
> вопросы)

да всё плохо с этими потоками, всё страшно и не понятно xD
и ничего тут не так же... тут всё как-то по пакетам... ваще я пока не понимаю этого... клиет будет для такого блокирующего ервера будет еще одной бедой моей:(


Сергей М.   (2009-04-29 19:28:00) [19]


> обычних серверов я три штуки написал


Значит пора прекращать задавать откровенно дилетантские вопросы)
"Три штуки"  - стаж как-никак солидный)


> в не блокирующем режиме, там всё просто, отправить и принять,
>  а тут сложннее


И здесь все тоже самое - "отправить и принять". Никакой разницы.


> REQUESTSIZE походуничему не равно, даже не инициализированно


"Походу" ты эти даже гордишься)
Было бы чем ..


> inherited FreeOnTerminate := TRUE; такого вроде у меня там
> и не было


Значит это я сам придумал от нечего делать)


Zalm   (2009-04-29 17:46:00) [20]

обычних серверов я три штуки написал, в не блокирующем режиме, там всё просто, отправить и принять, а тут сложннее, либо же я просто пока не понял кк это делать :(

REQUESTSIZE походу ничему не равно, даже не инициализированно.

inherited FreeOnTerminate := TRUE; такого вроде у меня там и не было...


Страницы:   1 2 3

Наверх

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